Spaces:
Running
Running
Upload 2 files
Browse files- flare-tasarim.md +460 -379
- flare-ui-tasarim.md +572 -516
flare-tasarim.md
CHANGED
@@ -1,379 +1,460 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
✅
|
7 |
-
✅ Spark ile
|
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 |
-
Bu
|
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 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
Bu
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
API
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# 🏗 Genel Mimari
|
2 |
+
|
3 |
+
Flare, Spark LLM motorunun üstünde çalışan, çok adımlı ve akıllı bir orchestration katmanıdır. Görevleri:
|
4 |
+
|
5 |
+
✅ Kullanıcıdan gelen mesajları Spark kullanarak sohbet halinde sürdürmek,
|
6 |
+
✅ Spark ile, kullanıcı mesajından intent ve parametre extraction akışını yönetmek,
|
7 |
+
✅ Eksik parametre değerleri için system prompt oluşturup, Spark ile insani mesaja dönüştürerek bu parametrelerin değerlerini kullanıcıya tamamlatmak,
|
8 |
+
✅ Doğru parameter değerleri ile API çağrıları yapmak,
|
9 |
+
✅ API cevabını Spark üzerinden insanileştirilmiş metne dönüştürmek ve kullanıcıya iletmek,
|
10 |
+
✅ Her şeyi session bazında, state machine mantığında takip etmek.
|
11 |
+
|
12 |
+
Bu yapı Parloa gibi sistemlerde kullanılan "flow engine + LLM + tool orchestration" yaklaşımına dayanır.
|
13 |
+
|
14 |
+
# LLM Provider Abstraction
|
15 |
+
|
16 |
+
Flare, farklı LLM provider'larını desteklemek için abstraction layer kullanır. Desteklenen provider'lar:
|
17 |
+
|
18 |
+
- **Spark (HuggingFace)**: On-premise ve HuggingFace cloud deployment'lar için
|
19 |
+
- **GPT-4o (OpenAI)**: OpenAI API üzerinden GPT-4o modeli kullanımı için
|
20 |
+
|
21 |
+
Work mode'a göre (`hfcloud`, `cloud`, `on-premise`, `gpt4o`) uygun LLM provider seçilir ve tüm LLM çağrıları bu abstraction üzerinden yapılır. Bu sayede farklı LLM'ler aynı intent detection, parameter extraction ve response generation mantığıyla çalışabilir.
|
22 |
+
|
23 |
+
# Spark Entegrasyonu
|
24 |
+
|
25 |
+
Spark servisinin base url'i service_config.jsonc dosyasında config.spark_endpoint olarak tanımlanmıştır.
|
26 |
+
|
27 |
+
Spark'a gönderilecek tüm request'lerde header'a Authorization: Bearer <SPARK_TOKEN> eklenmelidir. SPARK_TOKEN, .env dosyasında tanımlıdır.
|
28 |
+
|
29 |
+
# GPT-4o Entegrasyonu
|
30 |
+
|
31 |
+
Work mode `gpt4o` seçildiğinde, Spark yerine OpenAI API kullanılır. OpenAI API key, config.cloud_token alanında şifrelenmiş olarak saklanır (mevcut encryption_utils kullanılarak).
|
32 |
+
|
33 |
+
GPT-4o için özel konfigürasyonlar:
|
34 |
+
- Model seçimi: gpt-4o veya gpt-4o-mini
|
35 |
+
- Temperature: 0-2 arası (varsayılan 0.3)
|
36 |
+
- Max tokens: Response uzunluğu limiti
|
37 |
+
- System prompt ve conversation history OpenAI format'ına dönüştürülür
|
38 |
+
|
39 |
+
# Internal Prompt Mekanizması
|
40 |
+
|
41 |
+
Flare servisi, tüm LLM isteklerinde kullanılmak üzere merkezi bir internal_prompt tanımına sahiptir. Bu prompt, service_config.jsonc dosyasında config.internal_prompt olarak saklanır ve her intent detection işleminde project version'daki general_prompt'un başına otomatik olarak eklenir.
|
42 |
+
|
43 |
+
Internal prompt, LLM'in tutarlı davranış sergilemesi için gerekli temel kuralları içerir:
|
44 |
+
- Intent detection formatı ve kuralları
|
45 |
+
- Dil ayarları (<project language> placeholder'ı ile)
|
46 |
+
- Intent isimleri ve caption'ları (<intent names> ve <intent captions> placeholder'ları ile)
|
47 |
+
- Selamlama ve small talk davranışları
|
48 |
+
- Güvenlik kuralları
|
49 |
+
|
50 |
+
Bu mekanizma sayesinde tüm projeler arasında ve farklı LLM provider'ları arasında tutarlı bir davranış sağlanır. Internal prompt içindeki placeholder'lar runtime'da gerçek değerlerle değiştirilir:
|
51 |
+
- <intent names>: Proje versiyonu içinde tanımlı intentlerin name'leri, tırnak içinde ve virgülle ayrılmış şekilde
|
52 |
+
- <intent captions>: Proje versiyonu içinde tanımlı intentlerin caption'ları, tırnak içinde ve virgülle ayrılmış şekilde
|
53 |
+
- <project language>: Projenin default_language alanından alınan dil (Turkish, English, German, vb.)
|
54 |
+
|
55 |
+
# Startup
|
56 |
+
|
57 |
+
Flare servisi ayağa kalktıktan sonra ilk iş olarak service_config.jsonc dosyasında tanımlı enabled=true olan her bir project için, projenin published=true olan en büyük id'ye sahip versiyonundaki bilgilerle startup işlemi yapar:
|
58 |
+
|
59 |
+
**Spark Mode (hfcloud, cloud, on-premise)**:
|
60 |
+
Spark servisine /startup request'i gönderir:
|
61 |
+
```json
|
62 |
+
{
|
63 |
+
"work_mode": "<config.work_mode>",
|
64 |
+
"cloud_token": "<config.cloud_token>",
|
65 |
+
"project_name": "<project.name>",
|
66 |
+
"project_version": <project.version.id>,
|
67 |
+
"repo_id": "<project.version.llm.repo_id>",
|
68 |
+
"generation_config": <project.version.llm.generation_config>,
|
69 |
+
"use_fine_tune": <project.version.llm.use_fine_tune>,
|
70 |
+
"fine_tune_zip": "<project.version.llm.fine_tune_zip>"
|
71 |
+
}
|
72 |
+
```
|
73 |
+
|
74 |
+
**GPT-4o Mode**:
|
75 |
+
OpenAI API key'in geçerliliği kontrol edilir. Ek startup işlemi gerekmez.
|
76 |
+
|
77 |
+
# Chat
|
78 |
+
|
79 |
+
Chat request'leri work_mode'a göre ilgili LLM provider'a yönlendirilir:
|
80 |
+
|
81 |
+
**Spark için** /generate endpoint'ine:
|
82 |
+
```json
|
83 |
+
{
|
84 |
+
"project_name": "project1",
|
85 |
+
"system_prompt": "you are an helpful virtual assistant...",
|
86 |
+
"user_input": "en ekşi meyve nedir?",
|
87 |
+
"context": [
|
88 |
+
{ "role": "user", "content": "Merhaba!" },
|
89 |
+
{ "role": "assistant", "content": "Merhaba, nasıl yardımcı olabilirim?" }
|
90 |
+
]
|
91 |
+
}
|
92 |
+
```
|
93 |
+
|
94 |
+
**GPT-4o için** OpenAI Chat Completion API'ye uygun formatta:
|
95 |
+
```json
|
96 |
+
{
|
97 |
+
"model": "gpt-4o",
|
98 |
+
"messages": [
|
99 |
+
{ "role": "system", "content": "you are an helpful virtual assistant..." },
|
100 |
+
{ "role": "user", "content": "Merhaba!" },
|
101 |
+
{ "role": "assistant", "content": "Merhaba, nasıl yardımcı olabilirim?" },
|
102 |
+
{ "role": "user", "content": "en ekşi meyve nedir?" }
|
103 |
+
],
|
104 |
+
"temperature": 0.3,
|
105 |
+
"max_tokens": 512
|
106 |
+
}
|
107 |
+
```
|
108 |
+
|
109 |
+
# 🧠 İş Akışı
|
110 |
+
|
111 |
+
İş akışı tüm LLM provider'lar için aynıdır:
|
112 |
+
|
113 |
+
1. Sohbet için bir session ve state takibi yapılacağından, Flare'e öncelikle, request body'de project_name bilgisi içeren bir /start_session request'i gönderilir.
|
114 |
+
2. Flare unique bir session_id üretir ve bir session objesi yaratıp, session_id üzerinden indekslenmiş olan session dictionary'sine ekler ve response'ta session_id değerini döndürür. Session objesi içinde, gönderilen project_name'e karşılık gelen proje bilgileri (id, name, caption) ve proje tanımı altındaki versions array'indeki published=true olan version'lardan en büyük id'ye sahip olanın altındaki bilgileri (llm nesnesi hariç) alıp session nesnesine set eder. Oluşturduğu session'ın işleyişinde bundan sonra bu bilgileri kullanır.
|
115 |
+
3. Session nesnesi içinde ayrıca sohbetin context'ini takip edeceği chat_history array'i ve intent tespit etmesi durumunda, tespit ettiği intent, extract edilen parametreler ve eksik parametreleri takip edeceği property'ler, session state gibi sohbet akışında ihtiyaç duyacağı bilgileri tutar.
|
116 |
+
4. Ardından Flare'e bu session ile gönderilen tüm request'lerin header'ında X-Session-ID key içinde session_id değeri gönderilir.
|
117 |
+
5. Flare, kendisine gelen /chat request'lerini işletirken header'daki X-Session-ID değerini alır (yoksa hata döndürür) ve gönderilen session_id ile session dictionary'sinden ilgili session nesnesini bulur, sohbeti işletmek için session nesnesindeki değerleri kullanır.
|
118 |
+
6. Sohbet sırasında user_input bilgisi, session_id header'ıyla Flare'in /chat endpoint'ine gönderilir.
|
119 |
+
|
120 |
+
## 1️⃣ Intent Detection
|
121 |
+
1. Kullanıcı mesajı alınır.
|
122 |
+
2. LLM'e, kullanıcı mesajı, session'da tutulan sohbet tarihçesi ve session'da tutulan project version nesnesindeki intent tanımları birleştirilerek (detection_prompt ve intent detection'ı kolaylaştırma amaçlı örnek cümleler içeren examples kısmı) bir system prompt halinde gönderilir.
|
123 |
+
3. Eğer kullanıcının söyledikleri bir intent içermiyorsa, LLM kullanıcıyla normal sohbet eder.
|
124 |
+
4. LLM eğer intent belirlerse, parametreleri bu aşamada extract etmez. Bulduğu intent'in adını özel bir formatta döndürür. Örnek: `#DETECTED_INTENT:search_flight_intent`
|
125 |
+
|
126 |
+
## 2️⃣ Parametre Extraction
|
127 |
+
1. Belirlenen intent'e göre beklenen parametre listesi çıkarılır.
|
128 |
+
2. LLM'e, user_input ile birlikte parametre extraction_prompt'ları birleştirilip tek bir system prompt olarak gönderilir. LLM buradan parametre değerlerini extract eder ve özel bir formatta döndürür. Örnek:
|
129 |
+
`#PARAMETERS:{ "extracted": [ { "to_city": "İstanbul" } ], "missing": [ "to_city", "date"] }`
|
130 |
+
3. Döndürülen parametreler tanımdaki variable_name key'i ile session'a eklenir. Eğer birden fazla intent'te aynı variable_name'e sahip parametreler varsa, aynı değişken değerini paylaşırlar.
|
131 |
+
|
132 |
+
## 3️⃣ Eksik Parametre Tamamlama
|
133 |
+
1. Zorunlu parametrelerden eksik olanlar varsa, Flare bunları kullanıcıdan istemek için uygun prompt'u hazırlar ve LLM'e gönderir. Bunun için, eksik parametrelerin tanımlarındaki name ve intent.parameters.extraction_prompt'lar birleştirilerek tek bir system prompt haline getirilir.
|
134 |
+
2. LLM, kullanıcı cevabını işleyip tekrar extraction yapar ve yukarıdaki #PARAMETERS formatında Flare'e dönüş yapar. Eksik parametre değeri kalmayan kadar Flare-LLM iletişimi bu şekilde döner.
|
135 |
+
3. Sohbette bir intent tespit edildiğinde, bu intent'in zorunlu bir parametresinin variable_name'i session'da zaten mevcutsa ve değer içeriyorsa, bu parametre tekrar extract edilmeye çalışılmaz, session'daki ilgili variable'dan alınıp kullanılır.
|
136 |
+
|
137 |
+
## 4️⃣ Parametre Validation
|
138 |
+
1. Alınan her parameter değeri, parameter tanımındaki tip ve regex (min/max uzunluk gibi) kurallarla doğrulanır.
|
139 |
+
2. Hatalı değerler varsa, bu parametrelerin invalid_prompt'ları birleştirilip LLM'e tek bir system prompt olarak gönderilir ve LLM kullanıcıya doğrudan döndürülecek insani hata mesajını oluşturup döndürür. Örnek: "Söylediğiniz uçuş numarası hatalı. Uçuş numaranız 6 haneli bir numara olmalıdır."
|
140 |
+
|
141 |
+
## 5️⃣ API Çağrısı
|
142 |
+
Tüm parametreler tamamlanınca Flare, intent'e bağlı API çağrısını yapar.
|
143 |
+
Intent'e bağlı API adı, service_config.json'da ilgili intent nesnesinin action alanında tanımlıdır. Bu adı kullanarak apis altındaki ilgili api tanımına ulaşılabilir.
|
144 |
+
|
145 |
+
Bu aşamada kritik bir detay:
|
146 |
+
|
147 |
+
🔑 **Eğer API tanımında auth bölümü varsa:**
|
148 |
+
- Api çağırılmadan önce, session içinde auth_tokens[api_name] var mı control edilir. Varsa bu token kullanılır.
|
149 |
+
- Eğer yoksa, token alma işlemi yapılır.
|
150 |
+
- Token almak için, token_endpoint ve body_template kullanılarak token api servisine request gönderilir, dönen json response içinden response_token_path json path'i kullanılarak token değeri alınır.
|
151 |
+
- Alınan token session içinde auth_tokens[api_name] olarak saklanır.
|
152 |
+
- Token expire ederse, token_refresh_endpoint ve token_refresh_body kullanılarak mevcut token refresh edilir.
|
153 |
+
- Header ve body'lerdeki {auth_tokens.api_name.token} placeholder'ları bu token ile doldurulur.
|
154 |
+
|
155 |
+
Eğer auth tanımı yoksa, API çağrısı doğrudan yapılır.
|
156 |
+
Bu mekanizma API erişiminde güvenlik ve süreklilik sağlar.
|
157 |
+
|
158 |
+
## 6️⃣ Response Mapping
|
159 |
+
API'den dönen JSON response'tan belirli değerleri session değişkenlerine aktarma mekanizmasıdır. Her API tanımında response_mappings array'i ile tanımlanır:
|
160 |
+
```json
|
161 |
+
"response_mappings": [
|
162 |
+
{
|
163 |
+
"variable_name": "booking_id",
|
164 |
+
"type": "str",
|
165 |
+
"json_path": "booking.confirmation_number"
|
166 |
+
},
|
167 |
+
{
|
168 |
+
"variable_name": "departure_time",
|
169 |
+
"type": "date",
|
170 |
+
"json_path": "flight_details.departure.time"
|
171 |
+
}
|
172 |
+
]
|
173 |
+
```
|
174 |
+
Bu mapping'ler API başarılı response döndüğünde (status 200) otomatik olarak işlenir. Belirtilen json_path'teki değerler, tanımlanan type'a göre dönüştürülüp session.variables içine variable_name ile kaydedilir.
|
175 |
+
|
176 |
+
Desteklenen type'lar: str, int, float, bool, date
|
177 |
+
|
178 |
+
Bu mekanizma sayesinde API response'larından alınan değerler, sonraki intent'lerde veya API çağrılarında kullanılabilir hale gelir.
|
179 |
+
|
180 |
+
## 7️⃣ API Cevabını İnsanileştirme
|
181 |
+
Api'den dönen ham json, api tanımı altındaki response_prompt ile birlikte LLM'e gönderilir ve akıcı, insani bir cevap üretilir.
|
182 |
+
|
183 |
+
Not: Api tanımındaki response_prompt içindeki {{api_response}} değeri, api'den dönen json string ile replace edilir.
|
184 |
+
|
185 |
+
Örnek: `"response_prompt": "Aşağıdaki JSON döviz kuru bilgilerini içeriyor. Kullanıcıya anlaşılır bir Türkçe özet hazırla:\n\n{{api_response}}"`
|
186 |
+
|
187 |
+
## 8️⃣ Session ve State Takibi
|
188 |
+
Her kullanıcı sohbeti bir session ID ile takip edilir.
|
189 |
+
Session üzerinde:
|
190 |
+
- Son 10 adet konuşma tarihçesi,
|
191 |
+
- Son intent,
|
192 |
+
- Toplanan parametreler,
|
193 |
+
- Eksik parametreler,
|
194 |
+
- Akışın neresinde olduğumuz (intent detection, parameter extraction, api call, response humanization)
|
195 |
+
- Api token'ları
|
196 |
+
|
197 |
+
tutulur. Bu, çok adımlı akışlarda state kaybını engeller.
|
198 |
+
|
199 |
+
# Date Type Desteği
|
200 |
+
|
201 |
+
Parametre tanımlarında "date" type'ı desteklenmektedir. Date parametreleri:
|
202 |
+
- ISO format (YYYY-MM-DD) olarak saklanır
|
203 |
+
- Türkçe tarih ifadeleri otomatik olarak parse edilir (bugün, yarın, 15 Temmuz, vb.)
|
204 |
+
- Extraction prompt'larında güncel tarih context'i sağlanır
|
205 |
+
- Validation sırasında geçerli tarih formatı kontrolü yapılır
|
206 |
+
|
207 |
+
# 🏗 Mimari Bileşenler
|
208 |
+
|
209 |
+
| Bileşen | Görev |
|
210 |
+
|---------|-------|
|
211 |
+
| LLM Interface | Farklı LLM provider'larını abstract eden katman |
|
212 |
+
| Spark LLM | HuggingFace Spark servisi ile iletişim |
|
213 |
+
| GPT-4o LLM | OpenAI API ile iletişim |
|
214 |
+
| Flare Session Manager | Her kullanıcı için session ve state takibi |
|
215 |
+
| Flare Prompt Engine | Her aşamada LLM'e gönderilecek uygun system prompt'u dinamik hazırlayan yapı |
|
216 |
+
| API Connector | Tanımlı API'lere parametrelerle çağrı yapan, auth/refresh yöneten katman |
|
217 |
+
| Validation Engine | Parametre değerlerini tip ve format bazlı doğrulayan yapı |
|
218 |
+
| UI ve Config Katmanı | Flare işleyiş konfigürasyonu ve api tanımları; version bazlı project tanımlamaları; project tanımı altında intent tanımları; intent tanımı altında parametre tanımlarını yöneten arayüz |
|
219 |
+
|
220 |
+
# 📋 Yapılacaklar
|
221 |
+
|
222 |
+
✅ LLM abstraction layer geliştirilmesi
|
223 |
+
✅ Spark ile intent tespiti için system prompt tasarımı → Örnek cümlelerle zenginleştirme
|
224 |
+
✅ GPT-4o için prompt optimization
|
225 |
+
✅ Parametre extraction için intent bazlı prompt şablonları hazırlanması
|
226 |
+
✅ Eksik parametre tamamlama için eksik parametre bazlı prompt oluşturma
|
227 |
+
✅ Parametre tip tanımları ve validation engine geliştirilmesi
|
228 |
+
✅ API connector modülü → auth, refresh, token yönetimi, timeout, retry mantığı ile geliştirme
|
229 |
+
✅ Humanization prompt'larının API cevabına göre dinamik hazırlanması
|
230 |
+
✅ Session ve state machine geliştirme
|
231 |
+
✅ Response mapping mekanizması
|
232 |
+
✅ Internal prompt sistemi
|
233 |
+
✅ Date type desteği
|
234 |
+
✅ Multi-provider support
|
235 |
+
|
236 |
+
# 🔑 Önemli Notlar (Unutulmaması Gerekenler)
|
237 |
+
|
238 |
+
1. LLM prompt'ları tek seferde şişirilmemeli; sohbetin her aşamasında sadece gereken system prompt dinamik oluşturulup gönderilmeli.
|
239 |
+
2. Parametre extraction'da ek bir model (BERT vb.) yerine sadece seçilen LLM kullanılacak.
|
240 |
+
3. Intent başına (proje başına max ~8-10 intent), her bir intent için max ~5-6 örnek cümle şeklinde bir kapasite planlaması düşünülebilir.
|
241 |
+
4. Parametre tip ve regex validation başarısızsa, LLM üzerinden insani bir hata mesajı oluşturulup kullanıcıya döndürülmeli.
|
242 |
+
5. API response'larının insanileştirilmesi, kullanıcıya daha iyi bir deneyim sunmak için LLM'den geçmeli.
|
243 |
+
6. API token yönetimi ve refresh mekanizması, Flare içinde güvenli ve izlenebilir şekilde tutulmalı.
|
244 |
+
7. GPT-4o kullanımında token maliyetleri göz önünde bulundurulmalı, conversation history sınırlandırılmalı.
|
245 |
+
8. Farklı LLM'lerin response formatları normalize edilmeli (#DETECTED_INTENT ve #PARAMETERS formatları korunmalı).
|
246 |
+
|
247 |
+
# Servis Konfigürasyonu
|
248 |
+
|
249 |
+
Flare'in tanımlarını tutan bir document database gibi kullanacağımız service_config.jsonc dosyasının yapısı, örnek data ve alan açıklamaları ile birlikte aşağıdadır.
|
250 |
+
|
251 |
+
```jsonc
|
252 |
+
{
|
253 |
+
// =====================================================
|
254 |
+
// FLARE GLOBAL CONFIGURATION
|
255 |
+
// =====================================================
|
256 |
+
"config": {
|
257 |
+
"work_mode": "hfcloud", // "hfcloud" | "cloud" | "on-premise" | "gpt4o"
|
258 |
+
"cloud_token": "<your cloud token or OpenAI API key>", // work_mode'a göre Spark token veya OpenAI API key (şifrelenmiş)
|
259 |
+
"spark_endpoint": "https://ucsturkey-spark.hf.space", // Spark servisi URL (GPT mode'da kullanılmaz)
|
260 |
+
"internal_prompt": "⚠️ **NEVER output \"#DETECTED_INTENT:\"...", // Merkezi LLM kuralları
|
261 |
+
"project_id_counter": 1, // Yeni proje ID'leri için counter
|
262 |
+
"last_update_date": "2025-06-08T12:00:00.000Z", // Race condition kontrolü için
|
263 |
+
"last_update_user": "admin",
|
264 |
+
|
265 |
+
// === Login Users (bcrypt hash + salt): Flare UI kullanılabilecek user'lar ==============
|
266 |
+
"users": [
|
267 |
+
{
|
268 |
+
"username": "admin",
|
269 |
+
"password_hash": "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",
|
270 |
+
"salt": "random_salt_string"
|
271 |
+
}
|
272 |
+
]
|
273 |
+
},
|
274 |
+
|
275 |
+
// =====================================================
|
276 |
+
// PROJECTS: Her bir proje bir virtual agent'ı tanımlar
|
277 |
+
// =====================================================
|
278 |
+
"projects": [
|
279 |
+
{
|
280 |
+
"id": 1,
|
281 |
+
"name": "coronos_assistant", // Virtual agent adı
|
282 |
+
"caption": "Coronos Sanal Asistan",
|
283 |
+
"icon": "folder", // Material icon adı
|
284 |
+
"description": "Coronos müşteri hizmetleri asistanı", // Proje açıklaması
|
285 |
+
"enabled": true, // Kullanımda olma durumu
|
286 |
+
"default_language": "tr", // Varsayılan dil kodu
|
287 |
+
"supported_languages": ["tr", "en"], // Desteklenen diller
|
288 |
+
"timezone": "Europe/Istanbul", // Saat dilimi
|
289 |
+
"region": "tr-TR", // Bölge kodu
|
290 |
+
"last_version_number": 1, // Projelerin version_number için versiyon counter. Artarak ilerler.
|
291 |
+
"last_update_date": "2025-06-08T12:00:00.000Z",
|
292 |
+
"last_update_user": "admin",
|
293 |
+
"deleted": false,
|
294 |
+
"created_date": "2025-06-08T12:00:00.000Z",
|
295 |
+
"created_by": "admin",
|
296 |
+
|
297 |
+
// --------------------------------------------------------
|
298 |
+
// VERSIONS: Proje revizyonları ayrı bir version_number ile takip edilir.
|
299 |
+
// Yayınlanmış versiyonlar üzerinde düzenleme yapılamaz.
|
300 |
+
// Yeni versiyon oluşturumak için published versiyonlardan biri seçilir ve kopyası oluştulur, bu kopya üzerinde düzenleme yapılabilir.
|
301 |
+
// --------------------------------------------------------
|
302 |
+
"versions": [
|
303 |
+
{
|
304 |
+
"id": 1, // Proje versiyonu
|
305 |
+
"caption": "v1",
|
306 |
+
"published": true, // Versiyonun yayınlanma durumu.
|
307 |
+
|
308 |
+
// === Virtual agent'ın yapabileceği işleri tarifler =========
|
309 |
+
"general_prompt": "You are an airline assistant. You can book tickets, give information about booked tickets ...",
|
310 |
+
|
311 |
+
// === LLM configuration =======================
|
312 |
+
"llm": {
|
313 |
+
// Spark mode için:
|
314 |
+
"repo_id": "ytu-ce-cosmos/Turkish-Llama-8b-DPO-v0.1", // HuggingFace model repo ID
|
315 |
+
"generation_config": { // LLM generation parametreleri
|
316 |
+
"max_new_tokens": 128,
|
317 |
+
"temperature": 0.3,
|
318 |
+
"top_p": 0.7,
|
319 |
+
"repetition_penalty": 1.1
|
320 |
+
},
|
321 |
+
"use_fine_tune": false, // LoRA fine-tune model kullanılma durumu
|
322 |
+
"fine_tune_zip": "", // use_fine_tune: true ise, kullanılacak LoRA adapter zip'in URL'i
|
323 |
+
|
324 |
+
// GPT-4o mode için (work_mode = "gpt4o" olduğunda kullanılır):
|
325 |
+
"gpt_model": "gpt-4o", // "gpt-4o" | "gpt-4o-mini"
|
326 |
+
"gpt_temperature": 0.3, // 0-2 arası
|
327 |
+
"gpt_max_tokens": 512 // Maximum response token sayısı
|
328 |
+
},
|
329 |
+
|
330 |
+
// === INTENTS =================================
|
331 |
+
"intents": [
|
332 |
+
{
|
333 |
+
"name": "currency_rate_intent", // alt çizgi, tire yok
|
334 |
+
"caption": "Kur sorgulama",
|
335 |
+
"locale": "tr-TR",
|
336 |
+
"dependencies": [], // intent bağımlılıkları.
|
337 |
+
|
338 |
+
// Intent detection
|
339 |
+
"examples": [
|
340 |
+
"What is the dollar rate?",
|
341 |
+
"How much is the euro?"
|
342 |
+
],
|
343 |
+
"detection_prompt": "Identify if user is asking for currency rate information.", // Intent detection için kullanılacak system prompt.
|
344 |
+
|
345 |
+
// Parameters: Intent tespit edildiğinde, kullanıcının ifadesinden extract edilecek parametreler
|
346 |
+
"parameters": [
|
347 |
+
{
|
348 |
+
"name": "currency",
|
349 |
+
"caption": "Döviz cinsi", // Eksik parametreyi tamamlarken kullanıcıya söylenebilecek parametre adı
|
350 |
+
"type": "str", // "str" | "int" | "float" | "bool" | "date"
|
351 |
+
"required": true,
|
352 |
+
"variable_name": "currency", // Parametre değerini set edeceğimiz session değişkeni adı
|
353 |
+
"extraction_prompt": "Extract the currency code (USD, EUR, TRY) from the user message.", // Parametre extraction için kullanılacak system prompt
|
354 |
+
"validation_regex": "^(USD|EUR|TRY)$", // kullanıcıdan alınan parametre değerini validate etmek için kullanılacak regex. Opsiyonel.
|
355 |
+
"invalid_prompt": "Geçersiz para birimi girdiniz. USD, EUR veya TRY şeklinde giriniz.", // Parametre değeri invalid ise kullanıcıya söylenecek mesajı oluşturacak system prompt
|
356 |
+
"type_error_prompt": "Para birimi metin olmalıdır (ör: USD)." // Eğer parametre tipi hatalıysa kullanıcıya söylenecek mesajı oluşturacak system prompt
|
357 |
+
}
|
358 |
+
],
|
359 |
+
|
360 |
+
// API to call
|
361 |
+
"action": "currency_api", // Bu intent tespit edilip, parametreleri tamamlandığında çağırılacak api'nin adı.
|
362 |
+
|
363 |
+
// Fallbacks
|
364 |
+
"fallback_timeout_prompt": "Kur servisinde gecikme yaşanıyor. Lütfen biraz sonra tekrar deneyin.", // Api timeout durumunda kullanıcıya söylenecek mesajı oluşturacak system prompt
|
365 |
+
"fallback_error_prompt": "Kur bilgileri alınırken bir hata oluştu, daha sonra tekrar deneyebilir misiniz?" // Api hatası durumunda kullanıcıya söylenecek mesajı oluşturacak system prompt
|
366 |
+
}
|
367 |
+
// ... başka intent'ler
|
368 |
+
],
|
369 |
+
|
370 |
+
"last_update_date": "2025-06-08T12:00:00.000Z",
|
371 |
+
"last_update_user": "admin",
|
372 |
+
"deleted": false,
|
373 |
+
"created_date": "2025-06-08T12:00:00.000Z",
|
374 |
+
"created_by": "admin",
|
375 |
+
"publish_date": "2025-06-08T12:00:00.000Z",
|
376 |
+
"published_by": "admin"
|
377 |
+
}
|
378 |
+
// ... yeni versiyonlar
|
379 |
+
]
|
380 |
+
}
|
381 |
+
// ... başka projeler
|
382 |
+
],
|
383 |
+
|
384 |
+
// =====================================================
|
385 |
+
// API DEFINITIONS (dict by name): Intent'lerde action olarak kullanılacak api tanımları
|
386 |
+
// =====================================================
|
387 |
+
"apis": [
|
388 |
+
{
|
389 |
+
"name": "currency_api",
|
390 |
+
"url": "https://mock.api/currency",
|
391 |
+
"method": "POST",
|
392 |
+
|
393 |
+
// Headers as dict; placeholders destekler
|
394 |
+
"headers": {
|
395 |
+
"Content-Type": "application/json",
|
396 |
+
"Authorization": "Bearer {{auth_tokens.currency_api.token}}"
|
397 |
+
},
|
398 |
+
|
399 |
+
// Body template
|
400 |
+
"body_template": {
|
401 |
+
"currency": "{{variables.currency}}"
|
402 |
+
},
|
403 |
+
|
404 |
+
// Timeout & retry
|
405 |
+
"timeout_seconds": 5,
|
406 |
+
"retry": {
|
407 |
+
"retry_count": 3,
|
408 |
+
"backoff_seconds": 2,
|
409 |
+
"strategy": "static" // "static" | "exponential"
|
410 |
+
},
|
411 |
+
|
412 |
+
// Auth (optional)
|
413 |
+
"auth": {
|
414 |
+
"enabled": false,
|
415 |
+
"token_endpoint": "https://mock.api/auth",
|
416 |
+
"token_request_body": {},
|
417 |
+
"response_token_path": "token", // json-path style. Ex: xx.yy.z
|
418 |
+
"token_refresh_endpoint": null, // opsiyonel
|
419 |
+
"token_refresh_body": {} // token_refresh_endpoint varsa zorunlu, yoksa opsiyonel.
|
420 |
+
},
|
421 |
+
|
422 |
+
"proxy": "", // Proxy (optional)
|
423 |
+
|
424 |
+
// API response → human-friendly answer
|
425 |
+
"response_prompt": "Aşağıdaki JSON döviz kuru bilgilerini içeriyor. Kullanıcıya anlaşılır bir Türkçe özet hazırla:\n\n{{api_response}}",
|
426 |
+
|
427 |
+
// Response mapping
|
428 |
+
"response_mappings": [
|
429 |
+
{
|
430 |
+
"variable_name": "exchange_rate",
|
431 |
+
"type": "float",
|
432 |
+
"json_path": "data.rate"
|
433 |
+
}
|
434 |
+
],
|
435 |
+
|
436 |
+
"last_update_date": "2025-06-08T12:00:00.000Z",
|
437 |
+
"last_update_user": "admin",
|
438 |
+
"deleted": false,
|
439 |
+
"created_date": "2025-06-08T12:00:00.000Z",
|
440 |
+
"created_by": "admin"
|
441 |
+
}
|
442 |
+
],
|
443 |
+
|
444 |
+
// =====================================================
|
445 |
+
// ACTIVITY LOG
|
446 |
+
// =====================================================
|
447 |
+
"activity_log": [
|
448 |
+
{
|
449 |
+
"id": 1,
|
450 |
+
"timestamp": "2025-06-08T12:00:00.000Z",
|
451 |
+
"user": "admin",
|
452 |
+
"action": "CREATE_PROJECT",
|
453 |
+
"entity_type": "project",
|
454 |
+
"entity_id": 1,
|
455 |
+
"entity_name": "airline_agent",
|
456 |
+
"details": "Created new project"
|
457 |
+
}
|
458 |
+
]
|
459 |
+
}
|
460 |
+
```
|
flare-ui-tasarim.md
CHANGED
@@ -1,516 +1,572 @@
|
|
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 |
-
- Ctrl+
|
47 |
-
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
-
|
61 |
-
-
|
62 |
-
- PUT /api/
|
63 |
-
-
|
64 |
-
-
|
65 |
-
-
|
66 |
-
- DELETE /api/projects/{id} -
|
67 |
-
-
|
68 |
-
- POST /api/projects/{id}/versions -
|
69 |
-
-
|
70 |
-
-
|
71 |
-
-
|
72 |
-
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
- POST /api/spark/
|
80 |
-
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
- POST /api/
|
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 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
]
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
"
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
"
|
163 |
-
"
|
164 |
-
"
|
165 |
-
"
|
166 |
-
"
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
│
|
355 |
-
|
356 |
-
│
|
357 |
-
|
358 |
-
│
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Flare Administration UI - Tasarım Dokümanı
|
2 |
+
|
3 |
+
## 📌 Amaç
|
4 |
+
|
5 |
+
Flare Administration UI (Flare Admin), kullanıcıların Flare platformunda proje tanımlayıp yönetebileceği bir web arayüzüdür. Angular ile geliştirilir, backend olarak Python ile geliştirilmiş olan Flare backend'i kullanır.
|
6 |
+
|
7 |
+
Flare Admin ekranlarında; proje tanımlama, mevcut projeyi düzenleme, projeye versiyon çıkarma, versiyonu publish etme, projeyi enable-disable etme, proje tanımını silme gibi işlemler yapılabilir.
|
8 |
+
|
9 |
+
Document database olarak Flare'in service_config.jsonc dosyasını kullanır. Tüm tanım, düzenleme, silme ve listeleme işlemlerini bu dosya üzerinde yapar.
|
10 |
+
|
11 |
+
Flare Admin, Flare backend servisi üzerinden Spark veya GPT-4o ile entegre çalışır.
|
12 |
+
|
13 |
+
## Genel Kurallar
|
14 |
+
|
15 |
+
Flare Admin, login ekranıyla başlar. Kullanıcı login olduktan sonra tanım ekranları görüntülenir.
|
16 |
+
|
17 |
+
Tanım ekranları, tab window'lar şeklinde gruplandırılmıştır. Her tab'da birbiriyle alakalı işlemler yapılır.
|
18 |
+
|
19 |
+
Tüm hatalı işlemler, işlemin yapıldığı ekranın alt kısmında kırmızı font ile uyarı şeklinde görüntülenir ve uyarı 5 sn sonra kaybolur.
|
20 |
+
|
21 |
+
Boolean alanlar ekranda (hem input olarak, hem de tablo üzerinde) checkbox olarak görüntülenir.
|
22 |
+
|
23 |
+
Silme işlemleri öncesinde, silinecek nesnenin diğer nesneler altında kullanımda olup olmadığı kontrol edilir. Eğer kullanımdaysa, silinmesine izin verilmez ve hangi nesneler tarafından kullanıldığını içeren bir mesaj ve hata kodu ile döndürülür. Kullanımda olmayan nesneyi silme öncesinde açılacak bir dialog'da kullanıcıdan onay alınır. Onayın ardından silme işlemi yapılır.
|
24 |
+
|
25 |
+
Nesnenin **deleted** alanı varsa silme işlemi fiziksel olarak yapılmaz, deleted=true olarak değiştirilir.
|
26 |
+
|
27 |
+
Ortam çok kullanıcılı olduğundan kayıt düzenleme işlemlerinde race condition kontrolü yapılır. Bunun için service_config.jsonc içinde config, project, version ve api nesnelerine **last_update_date** alanı eklenir.
|
28 |
+
|
29 |
+
Kullanıcı, düzenlemek için nesneyi ekrana yüklediğinde nesne içindeki bu değeri de yükler. Save butonuna bastığında backend'e bu değeri de gönderir ve backend kayıt öncesi bu değerin service_config.jsonc'deki ilgili nesnedeki değerle aynı olup olmadığını kontrol eder, aynı ise kaydı yapar ve kaydederken bu değeri o andaki tarih-saat-dakika-saniye-milisaniye değeri ile günceller.
|
30 |
+
|
31 |
+
Eğer bir başka kullanıcı aynı kaydı düzenliyorsa ve ilk kullanıcıdan sonra save'e bastıysa dosyadaki bu değer değişmiş olacağından backend kayda izin vermez ve "Kayıt başka kullanıcı tarafından düzenlendi. Lütfen tekrar yükleyin." tarzı bir uyarı ile birlikte bir hata kodu döndürür.
|
32 |
+
|
33 |
+
Bir diğer durum da, kullanıcı tarafından düzenlenen kaydın, bu kullanıcı kaydetmeden önce başka bir kullanıcı tarafından silinmiş olması durumudur. Backend kayıt öncesi dosyada bu nesneyi bulamazsa "Kayıt başka kullanıcı tarafından silindi." gibi bir uyarı ve bir hata kodu döndürür, kayda izin vermez.
|
34 |
+
|
35 |
+
## Auto-save ve Undo/Redo Mekanizması
|
36 |
+
|
37 |
+
- Published olmayan version'lar üzerinde çalışırken her 30 saniyede bir otomatik draft kayıt yapılır
|
38 |
+
- Son 10 işlem için undo/redo desteği (Ctrl+Z / Ctrl+Y)
|
39 |
+
- Draft kayıtlar drafts/ klasöründe tutulur ve UI açıldığında "Recover unsaved changes?" dialog'u gösterilir
|
40 |
+
|
41 |
+
## Klavye Kısayolları
|
42 |
+
|
43 |
+
- Ctrl+S: Save
|
44 |
+
- Ctrl+N: New (context'e göre project/version/intent)
|
45 |
+
- Ctrl+F: Search/Filter
|
46 |
+
- Ctrl+D: Duplicate
|
47 |
+
- Esc: Cancel/Close dialog
|
48 |
+
|
49 |
+
## Flare Backend Düzenlemeleri
|
50 |
+
|
51 |
+
Flare backend'de Flare Admin UI işleyişi için bazı eklemeler yapılması gerekiyor.
|
52 |
+
|
53 |
+
### Eklenecek endpoint'ler:
|
54 |
+
|
55 |
+
#### Temel CRUD Endpoint'leri
|
56 |
+
|
57 |
+
- POST /api/login - Kullanıcı girişi ve token üretimi
|
58 |
+
- GET /api/environment - Environment bilgileri alma
|
59 |
+
- PUT /api/environment - Environment bilgilerini kaydetme
|
60 |
+
- GET /api/projects - Proje listeleme (pagination, filter, sort destekli)
|
61 |
+
- POST /api/projects - Yeni proje oluşturma: Yeni proje oluşturulduğunda backend, version_id_counter alanını **1**'e ayarlar ve otomatik **Version 1** kaydını ekler. Frontend ekstra çağrı yapmaz.
|
62 |
+
- PUT /api/projects/{id} - Mevcut projeyi düzenleme
|
63 |
+
- DELETE /api/projects/{id} - Mevcut projeyi silme
|
64 |
+
- PATCH /api/projects/{id}/toggle - Proje enable/disable
|
65 |
+
- POST /api/projects/{id}/versions - Proje versiyonu oluşturma
|
66 |
+
- DELETE /api/projects/{id}/versions/{version_id} - Versiyon silme
|
67 |
+
- PUT /api/projects/{id}/versions/{version_id} - Versiyon düzenleme
|
68 |
+
- POST /api/projects/{id}/versions/{version_id}/publish - Versiyon yayınlama
|
69 |
+
- GET /api/apis - API listeleme
|
70 |
+
- POST /api/apis - Yeni API ekleme
|
71 |
+
- PUT /api/apis/{name} - Mevcut API'yi düzenleme
|
72 |
+
- DELETE /api/apis/{name} - Mevcut API'yi silme
|
73 |
+
|
74 |
+
#### Spark Integration Endpoint'leri
|
75 |
+
|
76 |
+
- POST /api/spark/startup - Projeyi Spark'a yükle
|
77 |
+
- GET /api/spark/projects - Spark proje listesi
|
78 |
+
- POST /api/spark/project/enable - Projeyi aktifleştir
|
79 |
+
- POST /api/spark/project/disable - Projeyi devre dışı bırak
|
80 |
+
- DELETE /api/spark/project/{name} - Projeyi Spark'tan sil
|
81 |
+
|
82 |
+
#### Chat Endpoint'leri
|
83 |
+
|
84 |
+
- GET /api/projects/names - Chat için enabled proje listesi
|
85 |
+
- POST /api/start_session - Chat session başlat
|
86 |
+
- POST /api/chat - Mesaj gönder/al (Header: X-Session-ID)
|
87 |
+
|
88 |
+
#### Ek Yardımcı Endpoint'ler
|
89 |
+
|
90 |
+
- POST /api/validate/regex - Regex pattern validasyonu
|
91 |
+
- POST /api/apis/test - API endpoint test etme
|
92 |
+
- GET /api/projects/{id}/versions/diff - Version karşılaştırma
|
93 |
+
- POST /api/projects/{id}/intents/bulk-delete - Toplu intent silme
|
94 |
+
- GET /api/activity-log - Aktivite logları
|
95 |
+
- POST /api/projects/import - Proje import
|
96 |
+
- GET /api/projects/{id}/export - Proje export
|
97 |
+
- POST /api/test/run-all - Tüm testleri çalıştır
|
98 |
+
- GET /api/test/status - Test durumu sorgula
|
99 |
+
|
100 |
+
### Service_config.jsonc düzenlemeleri:
|
101 |
+
|
102 |
+
```jsonc
|
103 |
+
{
|
104 |
+
"config": {
|
105 |
+
// Mevcut alanlar...
|
106 |
+
"work_mode": "hfcloud", // "hfcloud" | "cloud" | "on-premise" | "gpt4o" - Yeni: gpt4o desteği
|
107 |
+
"cloud_token": "", // work_mode'a göre Spark token veya OpenAI API key (şifrelenmiş)
|
108 |
+
"internal_prompt": "⚠️ **NEVER output \"#DETECTED_INTENT:\"...", // Yeni
|
109 |
+
"project_id_counter": 1, // Yeni
|
110 |
+
"last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
|
111 |
+
"last_update_user": "admin" // Yeni
|
112 |
+
},
|
113 |
+
|
114 |
+
"projects": [{
|
115 |
+
// Mevcut alanlar...
|
116 |
+
"icon": "folder", // Yeni
|
117 |
+
"description": "", // Yeni
|
118 |
+
"default_language": "tr", // Yeni
|
119 |
+
"supported_languages": ["tr"], // Yeni
|
120 |
+
"timezone": "Europe/Istanbul", // Yeni
|
121 |
+
"region": "tr-TR", // Yeni
|
122 |
+
"version_id_counter": 1, // Yeni
|
123 |
+
"last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
|
124 |
+
"last_update_user": "admin", // Yeni
|
125 |
+
"deleted": false, // Yeni
|
126 |
+
"created_date": "2025-06-08T12:00:00.000Z", // Yeni
|
127 |
+
"created_by": "admin", // Yeni
|
128 |
+
|
129 |
+
"versions": [{
|
130 |
+
// Mevcut alanlar...
|
131 |
+
"llm": {
|
132 |
+
// Spark mode için:
|
133 |
+
"repo_id": "model-repo/id",
|
134 |
+
"generation_config": {},
|
135 |
+
"use_fine_tune": false,
|
136 |
+
"fine_tune_zip": "",
|
137 |
+
|
138 |
+
// GPT-4o mode için (work_mode = "gpt4o" olduğunda kullanılır):
|
139 |
+
"gpt_model": "gpt-4o", // "gpt-4o" | "gpt-4o-mini"
|
140 |
+
"gpt_temperature": 0.3, // 0-2 arası
|
141 |
+
"gpt_max_tokens": 512 // Maximum response token sayısı
|
142 |
+
},
|
143 |
+
"last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
|
144 |
+
"last_update_user": "admin", // Yeni
|
145 |
+
"deleted": false, // Yeni
|
146 |
+
"created_date": "2025-06-08T12:00:00.000Z", // Yeni
|
147 |
+
"created_by": "admin", // Yeni
|
148 |
+
"publish_date": null, // Yeni
|
149 |
+
"published_by": null // Yeni
|
150 |
+
}]
|
151 |
+
}],
|
152 |
+
|
153 |
+
"apis": [{
|
154 |
+
// Mevcut alanlar...
|
155 |
+
"response_mappings": [ // Yeni
|
156 |
+
{
|
157 |
+
"variable_name": "booking_id",
|
158 |
+
"type": "str",
|
159 |
+
"json_path": "confirmation.id"
|
160 |
+
}
|
161 |
+
],
|
162 |
+
"last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
|
163 |
+
"last_update_user": "admin", // Yeni
|
164 |
+
"deleted": false, // Yeni
|
165 |
+
"created_date": "2025-06-08T12:00:00.000Z", // Yeni
|
166 |
+
"created_by": "admin" // Yeni
|
167 |
+
}],
|
168 |
+
|
169 |
+
// Yeni: Activity log
|
170 |
+
"activity_log": [{
|
171 |
+
"id": 1,
|
172 |
+
"timestamp": "2025-06-08T12:00:00.000Z",
|
173 |
+
"user": "admin",
|
174 |
+
"action": "CREATE_PROJECT",
|
175 |
+
"entity_type": "project",
|
176 |
+
"entity_id": 1,
|
177 |
+
"entity_name": "airline_agent",
|
178 |
+
"details": "Created new project"
|
179 |
+
}]
|
180 |
+
}
|
181 |
+
```
|
182 |
+
|
183 |
+
## Tab Ekranları
|
184 |
+
|
185 |
+
### 1. User Info Tab'ı
|
186 |
+
|
187 |
+
Bu tab penceresinde login olan kullanıcı mevcut şifresini değiştirebilir. Ekrandaki alanlar:
|
188 |
+
|
189 |
+
- Current Password (maskeli)
|
190 |
+
- New Password (maskeli)
|
191 |
+
- New Password (tekrar, maskeli)
|
192 |
+
- Password Strength Indicator: Şifre girilirken güvenlik seviyesini gösterir (Weak/Medium/Strong)
|
193 |
+
- Save butonu
|
194 |
+
|
195 |
+
Şifre değiştirebilmek için kullanıcı, maskeli alanlardan mevcut şifresini, yeni şifresini ve ikinci bir alanda teyit amaçlı olarak tekrar yeni şifresini girer ve kaydet butonuna basar. Şifre en az 8 karakter, büyük/küçük harf ve rakam içermelidir.
|
196 |
+
|
197 |
+
### 2. Environment Tab'ı
|
198 |
+
|
199 |
+
Bu tab'da aşağıdaki alanlar bulunur:
|
200 |
+
|
201 |
+
- **Work Mode**: Seçenekleri **hfcloud**, **cloud**, **on-premise** ve **gpt4o** olan bir combo. Zorunlu.
|
202 |
+
- **Cloud Token / OpenAI API Key** (maskeli):
|
203 |
+
- Work Mode **on-premise** seçildiğinde disable olur.
|
204 |
+
- Work Mode **gpt4o** seçildiğinde label "OpenAI API Key" olarak değişir
|
205 |
+
- Diğer modlarda "Cloud Token" olarak görünür
|
206 |
+
- **Spark Endpoint**: URL formatında. GPT-4o mode hariç zorunlu. Yanında "Test Connection" butonu. GPT-4o seçildiğinde disable olur.
|
207 |
+
- **Internal System Prompt**: Expansion panel içinde multi-line textarea. LLM'in tüm projeler için kullanacağı temel kuralları içerir. Placeholder'lar:
|
208 |
+
- <intent names>: Runtime'da intent listesiyle değiştirilir
|
209 |
+
- <intent captions>: Intent caption'larıyla değiştirilir
|
210 |
+
- <project language>: Proje diline göre değiştirilir
|
211 |
+
- Save butonu
|
212 |
+
- Reload from Spark butonu: Spark'tan güncel config'i çeker (GPT mode'da disable)
|
213 |
+
|
214 |
+
**GPT-4o Mode Uyarısı**: Work mode GPT-4o seçildiğinde bir info alert gösterilir:
|
215 |
+
```
|
216 |
+
ℹ️ GPT-4o mode uses OpenAI's API which has usage-based pricing.
|
217 |
+
Please ensure you have sufficient credits in your OpenAI account.
|
218 |
+
Approximate cost: $0.01-0.03 per conversation turn.
|
219 |
+
```
|
220 |
+
|
221 |
+
### 3. APIs Tab'ı
|
222 |
+
|
223 |
+
Tab açıldığında, üstte bir toolbar bulunur:
|
224 |
+
|
225 |
+
**Toolbar:**
|
226 |
+
- New API butonu
|
227 |
+
- Import butonu: JSON dosyasından API tanımları yükler
|
228 |
+
- Export butonu: Seçili API'leri JSON olarak export eder
|
229 |
+
- Search alanı: API adı veya URL'de arama
|
230 |
+
- Display Deleted checkbox
|
231 |
+
|
232 |
+
**API Listesi Tablosu:**
|
233 |
+
|
234 |
+
| Name | URL | Method | Timeout | Auth | Deleted | Actions |
|
235 |
+
|------|-----|---------|---------|------|---------|---------|
|
236 |
+
| book_flight_api | https://api.example.com/book | POST | 10s | ✓ | ✗ | 🖊️ 🧪 📋 🗑️ |
|
237 |
+
|
238 |
+
**Action İkonları:**
|
239 |
+
- 🖊️ Edit: Edit API dialog'unu açar
|
240 |
+
- 🧪 Test: API'yi test eder
|
241 |
+
- 📋 Duplicate: API'nin kopyasını oluşturur
|
242 |
+
- 🗑️ Delete: API'yi siler (kullanımda değilse)
|
243 |
+
|
244 |
+
### 4. Projects Tab'ı
|
245 |
+
|
246 |
+
Tab ekranına girildiğinde üstte toolbar bulunur:
|
247 |
+
|
248 |
+
**Toolbar:**
|
249 |
+
- New Project butonu
|
250 |
+
- Import Project butonu
|
251 |
+
- Search alanı
|
252 |
+
- Display Deleted checkbox
|
253 |
+
- View: List/Card view toggle
|
254 |
+
|
255 |
+
**Proje Listesi:** Kart görünümünde her proje için:
|
256 |
+
```
|
257 |
+
┌─────────────────────────────────┐
|
258 |
+
│ 🛩️ airline_agent │
|
259 |
+
│ Havayolu Müşteri Temsilcisi │
|
260 |
+
│ Language: Turkish (tr) │
|
261 |
+
│ Versions: 3 (1 published) │
|
262 |
+
│ Status: ✓ Enabled │
|
263 |
+
│ Last update: 2 hours ago │
|
264 |
+
│ [Edit] [Versions] [Export] [⚙️] │
|
265 |
+
└─────────────────────────────────┘
|
266 |
+
```
|
267 |
+
|
268 |
+
### 5. Chat Tab'ı
|
269 |
+
|
270 |
+
Flare chat sistemini test etmek için kullanılır.
|
271 |
+
|
272 |
+
**İşleyiş:**
|
273 |
+
1. **Project Selection**: Enabled ve published version'u olan projeler listelenir
|
274 |
+
2. **Start Chat**: Session başlatır, session_id alır
|
275 |
+
3. **Chat Interface**:
|
276 |
+
- Mesaj history'si
|
277 |
+
- Input alanı
|
278 |
+
- Send butonu
|
279 |
+
- Session bilgileri (ID, project)
|
280 |
+
4. **End Session**: Chat'i sonlandırır
|
281 |
+
|
282 |
+
**Özellikler:**
|
283 |
+
- Real-time mesajlaşma
|
284 |
+
- Session takibi
|
285 |
+
- Auto-scroll
|
286 |
+
- Error handling
|
287 |
+
- Loading states
|
288 |
+
|
289 |
+
### 6. Spark Integration Tab'ı
|
290 |
+
|
291 |
+
Bu tab'da Spark servisi ile doğrudan etkileşim sağlanır. **GPT-4o mode'da bu tab disable olur ve bir bilgi mesajı gösterilir.**
|
292 |
+
|
293 |
+
**GPT-4o Mode'da Görünüm:**
|
294 |
+
```
|
295 |
+
┌─────────────────────────────────────────────┐
|
296 |
+
│ ℹ️ Spark Integration Unavailable │
|
297 |
+
│ │
|
298 |
+
│ Spark integration is not available when │
|
299 |
+
│ using GPT-4o as the LLM provider. │
|
300 |
+
│ │
|
301 |
+
│ GPT-4o handles all language model │
|
302 |
+
│ operations directly through OpenAI API. │
|
303 |
+
└─────────────────────────────────────────────┘
|
304 |
+
```
|
305 |
+
|
306 |
+
**Normal Mode'da (Spark):**
|
307 |
+
|
308 |
+
**Üst Bölüm:**
|
309 |
+
- Project Selection: Dropdown ile proje seçimi
|
310 |
+
- Proje seçildiğinde butonlar aktif olur
|
311 |
+
|
312 |
+
**Butonlar ve İşlevleri:**
|
313 |
+
|
314 |
+
**Project Startup**
|
315 |
+
- Seçili projeyi Spark'a yükler
|
316 |
+
- Backend üzerinden /spark/startup endpoint'ine istek atar
|
317 |
+
- Response'u detaylı olarak gösterir
|
318 |
+
|
319 |
+
**Get Project Status**
|
320 |
+
- Spark'taki tüm projelerin durumunu listeler
|
321 |
+
- Tablo formatında: project_name, version, status, enabled, last_accessed
|
322 |
+
- Status badge'leri: ready (yeşil), loading (turuncu), error (kırmızı), unloaded (gri)
|
323 |
+
|
324 |
+
**Enable Project**
|
325 |
+
- Seçili projeyi Spark'ta aktif hale getirir
|
326 |
+
|
327 |
+
**Disable Project**
|
328 |
+
- Seçili projeyi Spark'ta devre dışı bırakır
|
329 |
+
|
330 |
+
**Delete Project**
|
331 |
+
- Seçili projeyi Spark'tan tamamen siler
|
332 |
+
- Onay dialog'u gösterir
|
333 |
+
|
334 |
+
**Response Panel:**
|
335 |
+
- Her işlemden sonra açılan expansion panel
|
336 |
+
- Request ve response JSON'larını gösterir
|
337 |
+
- Timestamp bilgisi
|
338 |
+
- Success/error durumu
|
339 |
+
- Son 10 işlem history'si
|
340 |
+
|
341 |
+
### 7. Test Tab'ı
|
342 |
+
|
343 |
+
Bu tab'da sistemin end-to-end testi yapılabilir:
|
344 |
+
|
345 |
+
**Test Kategorileri:**
|
346 |
+
- UI Tests: Component render, navigation, form validation
|
347 |
+
- Backend Tests: API endpoint'leri, data integrity
|
348 |
+
- Integration Tests: UI-Backend entegrasyonu
|
349 |
+
- Spark Tests: LLM bağlantısı ve response kalitesi (GPT mode'da "GPT-4o Tests" olarak görünür)
|
350 |
+
|
351 |
+
**Ekran Düzeni:**
|
352 |
+
```
|
353 |
+
┌─────────────────────────────────────────────┐
|
354 |
+
│ [Run All Tests] [Run Selected] [Stop] │
|
355 |
+
├─────────────────────────────────────────────┤
|
356 |
+
│ □ All Tests │
|
357 |
+
│ □ UI Tests (15 tests) │
|
358 |
+
│ □ Login Flow │
|
359 |
+
│ □ Project CRUD │
|
360 |
+
│ □ Version Management │
|
361 |
+
│ □ Backend Tests (22 tests) │
|
362 |
+
│ □ Authentication │
|
363 |
+
│ □ API Endpoints │
|
364 |
+
│ □ Race Conditions │
|
365 |
+
│ □ Integration Tests (18 tests) │
|
366 |
+
│ □ LLM Tests (8 tests) │
|
367 |
+
├─────────────────────────────────────────────┤
|
368 |
+
│ Test Results: │
|
369 |
+
│ ✓ Login with valid credentials - 120ms │
|
370 |
+
│ ✓ Create new project - 340ms │
|
371 |
+
│ ✗ Delete API in use - Expected behavior │
|
372 |
+
│ ⏳ Testing LLM connection... │
|
373 |
+
│ │
|
374 |
+
│ Progress: ████████░░ 80% (48/60) │
|
375 |
+
│ Passed: 45 | Failed: 3 | Running: 5 │
|
376 |
+
└─────────────────────────────────────────────┤
|
377 |
+
```
|
378 |
+
|
379 |
+
**Test Detayları:** Her test için:
|
380 |
+
- Test adı ve açıklaması
|
381 |
+
- Çalışma süresi
|
382 |
+
- Hata durumunda detaylı log
|
383 |
+
- "Re-run" butonu
|
384 |
+
|
385 |
+
### 8. Activity Log (Sağ üst notification icon'a tıklandığında açılır)
|
386 |
+
|
387 |
+
```
|
388 |
+
┌─────────────────────────────────────┐
|
389 |
+
│ 🔔 Recent Activities │
|
390 |
+
├─────────────────────────────────────┤
|
391 |
+
│ 2 min ago │
|
392 |
+
│ 👤 admin published version 2 │
|
393 |
+
│ of airline_agent │
|
394 |
+
├─────────────────────────────────────┤
|
395 |
+
│ 15 min ago │
|
396 |
+
│ 👤 user1 updated flight_info_api │
|
397 |
+
├─────────────────────────────────────┤
|
398 |
+
│ 1 hour ago │
|
399 |
+
│ 👤 admin created new project │
|
400 |
+
│ hotel_booking │
|
401 |
+
├─────────────────────────────────────┤
|
402 |
+
│ [View All Activities] │
|
403 |
+
└─────────────────────────────────────┘
|
404 |
+
```
|
405 |
+
|
406 |
+
## Dialog Ekranları
|
407 |
+
|
408 |
+
### Edit API Dialog (Güncelleme)
|
409 |
+
|
410 |
+
**General Tab'a eklenenler:**
|
411 |
+
|
412 |
+
**Response Mappings Bölümü:**
|
413 |
+
- Variable Name: snake_case zorunlu
|
414 |
+
- Type: str, int, float, bool, date seçenekleri
|
415 |
+
- JSON Path: Dot notation ile path (örn: data.result.value)
|
416 |
+
- Add/Remove mapping butonları
|
417 |
+
- Validation: Variable name uniqueness
|
418 |
+
|
419 |
+
**Template Variables (Geliştirilmiş):**
|
420 |
+
- Tüm intent parametrelerinden otomatik liste
|
421 |
+
- Response mapping değişkenleri
|
422 |
+
- Auth token değişkenleri
|
423 |
+
- Config değişkenleri (work_mode, vb.)
|
424 |
+
- Tıklanabilir chip'ler ile kolay ekleme
|
425 |
+
|
426 |
+
**JSON Validation (Geliştirilmiş):**
|
427 |
+
- Numeric değişkenler için akıllı validation
|
428 |
+
- Template variable type checking
|
429 |
+
- Syntax highlighting
|
430 |
+
|
431 |
+
**Test Tab (Geliştirilmiş):**
|
432 |
+
- Editable test request JSON
|
433 |
+
- Placeholder değerlerle doldurma
|
434 |
+
- Reset to template butonu
|
435 |
+
- Response preview
|
436 |
+
|
437 |
+
### Edit Project Dialog (Güncelleme)
|
438 |
+
|
439 |
+
Yeni alanlar eklendi:
|
440 |
+
- Icon: Material icon seçimi (folder, work, shopping_cart, vb.)
|
441 |
+
- Description: Proje açıklaması
|
442 |
+
- Default Language: Varsayılan dil (tr, en, de, fr, es)
|
443 |
+
- Supported Languages: Desteklenen diller (çoklu seçim)
|
444 |
+
- Timezone: Saat dilimi (Europe/Istanbul, vb.)
|
445 |
+
- Region: Bölge kodu (tr-TR, vb.)
|
446 |
+
|
447 |
+
### Edit Version Dialog
|
448 |
+
|
449 |
+
**LLM Configuration Tab'a GPT-4o Desteği:**
|
450 |
+
|
451 |
+
Work mode'a göre conditional rendering:
|
452 |
+
|
453 |
+
**GPT-4o Mode'da:**
|
454 |
+
```
|
455 |
+
┌─────────────────────────────────────┐
|
456 |
+
│ GPT-4o Configuration │
|
457 |
+
├─────────────────────────────────────┤
|
458 |
+
│ Model: │
|
459 |
+
│ [▼ GPT-4o ] │
|
460 |
+
│ │
|
461 |
+
│ Temperature: (0 = Deterministic) │
|
462 |
+
│ [====|==============] 0.3 │
|
463 |
+
│ │
|
464 |
+
│ Max Tokens: │
|
465 |
+
│ [512 ] │
|
466 |
+
│ │
|
467 |
+
│ ℹ️ Cost estimate: ~$0.02/request │
|
468 |
+
└─────────────────────────────────────┘
|
469 |
+
```
|
470 |
+
|
471 |
+
**Spark Mode'da (mevcut):**
|
472 |
+
- Model Repository
|
473 |
+
- Generation Config (detaylı parametreler)
|
474 |
+
- Fine-tune options
|
475 |
+
|
476 |
+
### Edit Intent Dialog
|
477 |
+
|
478 |
+
[Mevcut içerik korunacak, değişiklik yok]
|
479 |
+
|
480 |
+
### Edit Parameter Dialog
|
481 |
+
|
482 |
+
Date type desteği eklendi:
|
483 |
+
- Type combo'suna "date" seçeneği
|
484 |
+
- Date formatı: YYYY-MM-DD (ISO format)
|
485 |
+
- Türkçe tarih ifadeleri için özel extraction prompt'lar
|
486 |
+
|
487 |
+
### Version Comparison Dialog
|
488 |
+
|
489 |
+
[Mevcut içerik korunacak, değişiklik yok]
|
490 |
+
|
491 |
+
## Flare Admin Test Planı
|
492 |
+
|
493 |
+
[Mevcut test planına ek olarak:]
|
494 |
+
|
495 |
+
### GPT-4o Integration Test Senaryoları:
|
496 |
+
|
497 |
+
**1. Environment Configuration:**
|
498 |
+
- Work mode'u GPT-4o'ya değiştir
|
499 |
+
- OpenAI API key gir
|
500 |
+
- Save et
|
501 |
+
- Spark endpoint'in disable olduğunu kontrol et
|
502 |
+
|
503 |
+
**2. Version Management:**
|
504 |
+
- GPT-4o mode'da yeni version oluştur
|
505 |
+
- LLM tab'ında sadece GPT config'lerinin göründüğünü doğrula
|
506 |
+
- Model, temperature, max_tokens ayarla
|
507 |
+
- Publish et
|
508 |
+
|
509 |
+
**3. Spark Tab Behavior:**
|
510 |
+
- GPT-4o mode'da Spark tab'ın disable olduğunu kontrol et
|
511 |
+
- Bilgi mesajının göründüğünü doğrula
|
512 |
+
|
513 |
+
**4. Chat Testing:**
|
514 |
+
- GPT-4o kullanan proje ile chat başlat
|
515 |
+
- Intent detection test et
|
516 |
+
- Parameter extraction test et
|
517 |
+
- Response kalitesini değerlendir
|
518 |
+
|
519 |
+
**5. Cost Tracking:**
|
520 |
+
- Chat sonrası tahmini maliyet gösterimini kontrol et
|
521 |
+
- Token kullanım bilgilerini doğrula
|
522 |
+
|
523 |
+
### Multi-Provider Switching:
|
524 |
+
|
525 |
+
**1. Mode Değişimi:**
|
526 |
+
- Spark → GPT-4o → Spark geçişleri yap
|
527 |
+
- Her geçişte config'lerin korunduğunu kontrol et
|
528 |
+
- Token/key bilgilerinin şifreli kaldığını doğrula
|
529 |
+
|
530 |
+
**2. Project Compatibility:**
|
531 |
+
- Aynı projeyi farklı modlarda test et
|
532 |
+
- Intent ve parameter mantığının tutarlı çalıştığını doğrula
|
533 |
+
|
534 |
+
## Güvenlik ve Performans
|
535 |
+
|
536 |
+
### Token Yönetimi:
|
537 |
+
- SPARK_TOKEN environment variable'dan alınır
|
538 |
+
- OPENAI_API_KEY cloud_token alanında şifrelenmiş saklanır
|
539 |
+
- Tüm LLM isteklerinde uygun Authorization header
|
540 |
+
- Token rotation desteği
|
541 |
+
|
542 |
+
### GPT-4o Özel Güvenlik:
|
543 |
+
- API key asla plain text olarak loglanmaz
|
544 |
+
- Rate limit handling
|
545 |
+
- Cost monitoring ve alerting
|
546 |
+
- Quota management
|
547 |
+
|
548 |
+
### Race Condition Handling:
|
549 |
+
- last_update_date kontrolü tüm CRUD işlemlerinde
|
550 |
+
- Concurrent edit detection
|
551 |
+
- Optimistic locking pattern
|
552 |
+
|
553 |
+
### Session Management:
|
554 |
+
- 30 dakika inactivity timeout
|
555 |
+
- Session cleanup thread
|
556 |
+
- Memory-efficient storage
|
557 |
+
- GPT-4o için token count tracking
|
558 |
+
|
559 |
+
## Teknoloji Stack
|
560 |
+
|
561 |
+
- **Frontend**: Angular 17+ (standalone components)
|
562 |
+
- **UI Framework**: Angular Material
|
563 |
+
- **State Management**: RxJS
|
564 |
+
- **Backend**: Python FastAPI
|
565 |
+
- **Authentication**: JWT
|
566 |
+
- **Database**: service_config.jsonc (document database pattern)
|
567 |
+
- **LLM Integration**:
|
568 |
+
- Spark servisi (HuggingFace)
|
569 |
+
- OpenAI API (GPT-4o)
|
570 |
+
- **Encryption**: Fernet (cloud_token/API key şifreleme)
|
571 |
+
|
572 |
+
Bu güncellemelerle Flare Administration UI, hem Spark hem de GPT-4o desteği ile çok daha esnek bir orchestration platform yönetim arayüzü haline gelmiştir.
|