ciyidogan commited on
Commit
770dbf9
·
verified ·
1 Parent(s): 59af864

Upload 2 files

Browse files
Files changed (2) hide show
  1. flare-tasarim.md +460 -379
  2. flare-ui-tasarim.md +572 -516
flare-tasarim.md CHANGED
@@ -1,379 +1,460 @@
1
- Güncellenmiş flare-tasarim.md
2
- markdown# 🏗 Genel Mimari
3
-
4
- Flare, Spark LLM motorunun üstünde çalışan, çok adımlı ve akıllı bir orchestration katmanıdır. Görevleri:
5
-
6
- Kullanıcıdan gelen mesajları Spark kullanarak sohbet halinde sürdürmek,
7
- ✅ Spark ile, kullanıcı mesajından intent ve parametre extraction akışını yönetmek,
8
- 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,
9
- Doğru parameter değerleri ile API çağrıları yapmak,
10
- API cevabını Spark üzerinden insanileştirilmiş metne dönüştürmek ve kullanıcıya iletmek,
11
- ✅ Her şeyi session bazında, state machine mantığında takip etmek.
12
-
13
- Bu yapı Parloa gibi sistemlerde kullanılan "flow engine + LLM + tool orchestration" yaklaşımına dayanır.
14
-
15
- # Spark Entegrasyonu
16
-
17
- Spark servisinin base url'i service_config.jsonc dosyasında config.spark_endpoint olarak tanımlanmıştır.
18
-
19
- Spark'a gönderilecek tüm request'lerde header'a Authorization: Bearer <SPARK_TOKEN> eklenmelidir. SPARK_TOKEN, .env dosyasında tanımlıdır.
20
-
21
- # Internal Prompt Mekanizması
22
-
23
- Flare servisi, tüm Spark 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.
24
-
25
- Internal prompt, Spark'ın tutarlı davranış sergilemesi için gerekli temel kuralları içerir:
26
- - Intent detection formatı ve kuralları
27
- - Dil ayarları (<project language> placeholder'ı ile)
28
- - Intent isimleri ve caption'ları (<intent names> ve <intent captions> placeholder'ları ile)
29
- - Selamlama ve small talk davranışları
30
- - Güvenlik kuralları
31
-
32
- Bu mekanizma sayesinde tüm projeler arasında tutarlı bir Spark davranışı sağlanır. Internal prompt içindeki placeholder'lar runtime'da gerçek değerlerle değiştirilir:
33
- - <intent names>: Proje versiyonu içinde tanımlı intentlerin name'leri, tırnak içinde ve virgülle ayrılmış şekilde
34
- - <intent captions>: Proje versiyonu içinde tanımlı intentlerin caption'ları, tırnak içinde ve virgülle ayrılmış şekilde
35
- - <project language>: Projenin default_language alanından alınan dil (Turkish, English, German, vb.)
36
-
37
- # Startup
38
-
39
- 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 ve dosyadaki config nesnesi altındaki work_mode ve cloud_token bilgisi ile birlikte, spark_endpoint url'indeki Spark servisine bir /startup request'i gönderir.
40
-
41
- Bu request'in body formatı şu şekilde:
42
-
43
- ```json
44
- {
45
- "work_mode": "<config.work_mode>",
46
- "cloud_token": "<config.cloud_token>",
47
- "project_name": "<project.name>",
48
- "project_version": <project.version.id>,
49
- "repo_id": "<project.version.llm.repo_id>",
50
- "generation_config": <project.version.llm.generation_config>,
51
- "use_fine_tune": <project.version.llm.use_fine_tune>,
52
- "fine_tune_zip": "<project.version.llm.fine_tune_zip>"
53
- }
54
- Başarılı response örneği:
55
- json{ "message": "✅ project1 versiyon 1 yükleniyor (arka planda)." }
56
- Başarısız response örneği:
57
- json{ "error": "<error mesajı>" }
58
- Chat
59
- Chat request'lerini Spark'ın /generate endpoint'ine gönderiyoruz. Json request format şu şekilde:
60
- json{
61
- "project_name": "project1",
62
- "system_prompt": "you are an helpful virtual assistant. answer the questions of the user with a formal manner.",
63
- "user_input": "en ekşi meyve nedir?",
64
- "context": [
65
- { "role": "user", "content": "Merhaba!" },
66
- { "role": "assistant", "content": "Merhaba, nasıl yardımcı olabilirim?" }
67
- ]
68
- }
69
- Response format:
70
- json{
71
- "model_answer": "En ekşi meyve..."
72
- }
73
- 🧠 İş Akışı
74
- 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.
75
- 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.
76
- 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.
77
- 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.
78
- 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.
79
- Sohbet sırasında user_input bilgisi, session_id header'ıyla Flare'in /chat endpoint'ine gönderilir.
80
- 1️⃣ Intent Detection
81
- Kullanıcı mesajı alınır.
82
- Spark 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.
83
- Eğer kullanıcının söyledikleri bir intent içermiyorsa, Spark kullanıcıyla normal sohbet eder.
84
- Spark 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
85
- 2️⃣ Parametre Extraction
86
- Belirlenen intent'e göre beklenen parametre listesi çıkarılır.
87
- Spark'a, user_input ile birlikte parametre extraction_prompt'ları birleştirilip tek bir system prompt olarak gönderilir. Spark buradan parametre değerlerini extract eder ve özel bir formatta döndürür. Örnek:
88
- #PARAMETERS:{ "extracted": [ { "to_city": "İstanbul" } ], "missing": [ "to_city", "date"] }
89
- 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.
90
- 3️⃣ Eksik Parametre Tamamlama
91
- Zorunlu parametrelerden eksik olanlar varsa, Flare bunları kullanıcıdan istemek için uygun prompt'u hazırlar ve Spark'a 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.
92
- Spark, 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-Spark iletişimi bu şekilde döner.
93
- 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.
94
- 4️⃣ Parametre Validation
95
- Alınan her parameter değeri, parameter tanımındaki tip ve regex (min/max uzunluk gibi) kurallarla doğrulanır.
96
- Hatalı değerler varsa, bu parametrelerin invalid_prompt'ları birleştirilip Spark'a tek bir system prompt olarak gönderilir ve Spark 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."
97
- 5️⃣ API Çağrısı
98
- Tüm parametreler tamamlanınca Flare, intent'e bağlı API çağrısını yapar.
99
- 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.
100
- Bu aşamada kritik bir detay:
101
- 🔑 Eğer API tanımında auth bölümü varsa,
102
-
103
- Api çağırılmadan önce, session içinde auth_tokens[api_name] var mı control edilir. Varsa bu token kullanılır.
104
- Eğer yoksa, token alma işlemi yapılır.
105
- 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.
106
- Alınan token session içinde auth_tokens[api_name] olarak saklanır.
107
- Token expire ederse, token_refresh_endpoint ve token_refresh_body kullanılarak mevcut token refresh edilir.
108
- Header ve body'lerdeki {auth_tokens.api_name.token} placeholder'ları bu token ile doldurulur.
109
- Eğer auth tanımı yoksa, API çağrısı doğrudan yapılır.
110
-
111
- Bu mekanizma API erişiminde güvenlik ve süreklilik sağlar.
112
- 6️⃣ Response Mapping
113
- 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:
114
- json"response_mappings": [
115
- {
116
- "variable_name": "booking_id",
117
- "type": "str",
118
- "json_path": "booking.confirmation_number"
119
- },
120
- {
121
- "variable_name": "departure_time",
122
- "type": "date",
123
- "json_path": "flight_details.departure.time"
124
- }
125
- ]
126
- 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.
127
- Desteklenen type'lar: str, int, float, bool, date
128
- Bu mekanizma sayesinde API response'larından alınan değerler, sonraki intent'lerde veya API çağrılarında kullanılabilir hale gelir.
129
- 7️⃣ API Cevabını İnsanileştirme
130
- Api'den dönen ham json, api tanımı altındaki response_prompt ile birlikte Spark'a gönderilir ve akıcı, insani bir cevap üretilir.
131
- Not: Api tanımındaki response_prompt içindeki {{api_response}} değeri, api'den dönen json string ile replace edilir.
132
- Ö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}}"
133
- 8️⃣ Session ve State Takibi
134
- Her kullanıcı sohbeti bir session ID ile takip edilir.
135
- Session üzerinde:
136
-
137
- Son 10 adet konuşma tarihçesi,
138
- Son intent,
139
- Toplanan parametreler,
140
- Eksik parametreler,
141
- Akışın neresinde olduğumuz (intent detection, parameter extraction, api call, response humanization)
142
- Api token'ları
143
- tutulur.
144
-
145
- Bu, çok adımlı akışlarda state kaybını engeller.
146
- Date Type Desteği
147
- Parametre tanımlarında "date" type'ı desteklenmektedir. Date parametreleri:
148
-
149
- ISO format (YYYY-MM-DD) olarak saklanır
150
- Türkçe tarih ifadeleri otomatik olarak parse edilir (bugün, yarın, 15 Temmuz, vb.)
151
- Extraction prompt'larında güncel tarih context'i sağlanır
152
- Validation sırasında geçerli tarih formatı kontrolü yapılır
153
-
154
- 🏗 Mimari Bileşenler
155
- BileşenGörevSpark LLMIntent tespiti, parametre extraction, eksik tamamlama ve humanizationFlare Session ManagerHer kullanıcı için session ve state takibiFlare Prompt EngineHer aşamada Spark'a gönderilecek uygun system prompt'u dinamik hazırlayan yapıAPI ConnectorTanımlı API'lere parametrelerle çağrı yapan, auth/refresh yöneten katmanValidation EngineParametre değerlerini tip ve format bazlı doğrulayan yapı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
156
- 📋 Yapılacaklar
157
- ✅ Spark ile intent tespiti için system prompt tasarımı → Örnek cümlelerle zenginleştirme
158
- Parametre extraction için intent bazlı prompt şablonları hazırlanması
159
- Eksik parametre tamamlama için eksik parametre bazlı prompt oluşturma
160
- ✅ Parametre tip tanımları ve validation engine geliştirilmesi
161
- API connector modülü → auth, refresh, token yönetimi, timeout, retry mantığı ile geliştirme
162
- ✅ Humanization prompt'larının API cevabına göre dinamik hazırlanması
163
- Session ve state machine geliştirme
164
- Response mapping mekanizması
165
- Internal prompt sistemi
166
- ✅ Date type desteği
167
- 🔑 Önemli Notlar (Unutulmaması Gerekenler)
168
-
169
- LLM prompt'ları tek seferde şişirilmemeli; sohbetin her aşamasında sadece gereken system prompt dinamik oluşturulup gönderilmeli.
170
- Parametre extraction'da ek bir model (BERT vb.) yerine sadece Spark kullanılacak.
171
- 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.
172
- Parametre tip ve regex validation başarısızsa, Spark üzerinden insani bir hata mesajı oluşturulup kullanıcıya döndürülmeli,
173
- API response'larının insanileştirilmesi, kullanıcıya daha iyi bir deneyim sunmak için Spark'tan geçmeli.
174
- API token yönetimi ve refresh mekanizması, Flare içinde güvenli ve izlenebilir şekilde tutulmalı.
175
-
176
- Servis Konfigürasyonu
177
- 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.
178
- jsonc{
179
- // =====================================================
180
- // FLARE GLOBAL CONFIGURATION
181
- // =====================================================
182
- "config": {
183
- "work_mode": "hfcloud", // "hfcloud" | "cloud" | "on-premise"
184
- "cloud_token": "<your cloud token>", // eğer workmode hfcloud ya da cloud ise zorunlu, on-premise'de kullanılmayacak.
185
- "spark_endpoint": "https://ucsturkey-spark.hf.space", // Spark servisine erişim için kullanılacak url
186
- "internal_prompt": "⚠️ **NEVER output \"#DETECTED_INTENT:\"...", // Merkezi Spark kuralları
187
- "project_id_counter": 1, // Yeni proje ID'leri için counter
188
- "last_update_date": "2025-06-08T12:00:00.000Z", // Race condition kontrolü için
189
- "last_update_user": "admin",
190
-
191
- // === Login Users (bcrypt hash + salt): Flare UI kullanılabilecek user'lar ==============
192
- "users": [
193
- {
194
- "username": "admin",
195
- "password_hash": "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",
196
- "salt": "random_salt_string"
197
- }
198
- ]
199
- },
200
-
201
- // =====================================================
202
- // PROJECTS: Her bir proje bir virtual agent'ı tanımlar
203
- // =====================================================
204
- "projects": [
205
- {
206
- "id": 1,
207
- "name": "coronos_assistant", // Virtual agent adı
208
- "caption": "Coronos Sanal Asistan",
209
- "icon": "folder", // Material icon adı
210
- "description": "Coronos müşteri hizmetleri asistanı", // Proje açıklaması
211
- "enabled": true, // Kullanımda olma durumu
212
- "default_language": "tr", // Varsayılan dil kodu
213
- "supported_languages": ["tr", "en"], // Desteklenen diller
214
- "timezone": "Europe/Istanbul", // Saat dilimi
215
- "region": "tr-TR", // Bölge kodu
216
- "last_version_number": 1, // Projelerin version_number için versiyon counter. Artarak ilerler.
217
- "last_update_date": "2025-06-08T12:00:00.000Z",
218
- "last_update_user": "admin",
219
- "deleted": false,
220
- "created_date": "2025-06-08T12:00:00.000Z",
221
- "created_by": "admin",
222
-
223
- // --------------------------------------------------------
224
- // VERSIONS: Proje revizyonları ayrı bir version_number ile takip edilir.
225
- // Yayınlanmış versiyonlar üzerinde düzenleme yapılamaz.
226
- // Yeni versiyon oluşturumak için published versiyonlardan biri seçilir ve kopyası oluştulur, bu kopya üzerinde düzenleme yapılabilir.
227
- // --------------------------------------------------------
228
- "versions": [
229
- {
230
- "id": 1, // Proje versiyonu
231
- "caption": "v1",
232
- "published": true, // Versiyonun yayınlanma durumu.
233
-
234
- // === Virtual agent'ın yapabileceği işleri tarifler =========
235
- "general_prompt": "You are an airline assistant. You can book tickets, give information about booked tickets ...",
236
-
237
- // === LLM configuration =======================
238
- "llm": {
239
- "repo_id": "ytu-ce-cosmos/Turkish-Llama-8b-DPO-v0.1", // eğer workmode hfcloud ve cloud ise, kullanılacak llm'in repo id'si. Eğer on-premise ise, llm'in indirileceği url ya da llm'in indirilmeden kullanılacağı network folder path
240
- "generation_config": { // Llm'in kullanımı için gerekli konfigürasyon parametreleri
241
- "max_new_tokens": 128,
242
- "temperature": 0.3,
243
- "top_p": 0.7,
244
- "repetition_penalty": 1.1
245
- },
246
- "use_fine_tune": false, // LoRA fine-tune model kullanılma durumu
247
- "fine_tune_zip": "" // use_fine_tune: true ise, kullanılacak LoRA adapter zip'in indirleceği url, ya da network file path.
248
- },
249
-
250
- // === INTENTS =================================
251
- "intents": [
252
- {
253
- "name": "currency_rate_intent", // alt çizgi, tire yok
254
- "caption": "Kur sorgulama",
255
- "locale": "tr-TR",
256
- "dependencies": [], // intent bağımlılıkları.
257
-
258
- // Intent detection
259
- "examples": [
260
- "What is the dollar rate?",
261
- "How much is the euro?"
262
- ],
263
- "detection_prompt": "Identify if user is asking for currency rate information.", // Intent detection için kullanılacak system prompt.
264
-
265
- // Parameters: Intent tespit edildiğinde, kullanıcının ifadesinden extract edilecek parametreler
266
- "parameters": [
267
- {
268
- "name": "currency",
269
- "caption": "Döviz cinsi", // Eksik parametreyi tamamlarken kullanıcıya söylenebilecek parametre adı
270
- "type": "str", // "str" | "int" | "float" | "bool" | "date"
271
- "required": true,
272
- "variable_name": "currency", // Parametre değerini set edeceğimiz session değişkeni adı
273
- "extraction_prompt": "Extract the currency code (USD, EUR, TRY) from the user message.", // Parametre extraction için kullanılacak system prompt
274
- "validation_regex": "^(USD|EUR|TRY)$", // kullanıcıdan alınan parametre değerini validate etmek için kullanılacak regex. Opsiyonel.
275
- "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
276
- "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
277
- }
278
- ],
279
-
280
- // API to call
281
- "action": "currency_api", // Bu intent tespit edilip, parametreleri tamamlandığında çağırılacak api'nin adı.
282
-
283
- // Fallbacks
284
- "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
285
- "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
286
- }
287
- // ... başka intent'ler
288
- ],
289
-
290
- "last_update_date": "2025-06-08T12:00:00.000Z",
291
- "last_update_user": "admin",
292
- "deleted": false,
293
- "created_date": "2025-06-08T12:00:00.000Z",
294
- "created_by": "admin",
295
- "publish_date": "2025-06-08T12:00:00.000Z",
296
- "published_by": "admin"
297
- }
298
- // ... yeni versiyonlar
299
- ]
300
- }
301
- // ... başka projeler
302
- ],
303
-
304
- // =====================================================
305
- // API DEFINITIONS (dict by name): Intent'lerde action olarak kullanılacak api tanımları
306
- // =====================================================
307
- "apis": [
308
- {
309
- "name": "currency_api",
310
- "url": "https://mock.api/currency",
311
- "method": "POST",
312
-
313
- // Headers as dict; placeholders destekler
314
- "headers": {
315
- "Content-Type": "application/json",
316
- "Authorization": "Bearer {{auth_tokens.currency_api.token}}"
317
- },
318
-
319
- // Body template
320
- "body_template": {
321
- "currency": "{{variables.currency}}"
322
- },
323
-
324
- // Timeout & retry
325
- "timeout_seconds": 5,
326
- "retry": {
327
- "retry_count": 3,
328
- "backoff_seconds": 2,
329
- "strategy": "static" // "static" | "exponential"
330
- },
331
-
332
- // Auth (optional)
333
- "auth": {
334
- "enabled": false,
335
- "token_endpoint": "https://mock.api/auth",
336
- "token_request_body": {},
337
- "response_token_path": "token", // json-path style. Ex: xx.yy.z
338
- "token_refresh_endpoint": null, // opsiyonel
339
- "token_refresh_body": {} // token_refresh_endpoint varsa zorunlu, yoksa opsiyonel.
340
- },
341
-
342
- "proxy": "", // Proxy (optional)
343
-
344
- // API response → human-friendly answer
345
- "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}}",
346
-
347
- // Response mapping
348
- "response_mappings": [
349
- {
350
- "variable_name": "exchange_rate",
351
- "type": "float",
352
- "json_path": "data.rate"
353
- }
354
- ],
355
-
356
- "last_update_date": "2025-06-08T12:00:00.000Z",
357
- "last_update_user": "admin",
358
- "deleted": false,
359
- "created_date": "2025-06-08T12:00:00.000Z",
360
- "created_by": "admin"
361
- }
362
- ],
363
-
364
- // =====================================================
365
- // ACTIVITY LOG
366
- // =====================================================
367
- "activity_log": [
368
- {
369
- "id": 1,
370
- "timestamp": "2025-06-08T12:00:00.000Z",
371
- "user": "admin",
372
- "action": "CREATE_PROJECT",
373
- "entity_type": "project",
374
- "entity_id": 1,
375
- "entity_name": "airline_agent",
376
- "details": "Created new project"
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
- ## Güncellenmiş flare-ui-2.0.md
2
-
3
- ```markdown
4
- # Flare Administration UI - Tasarım Dokümanı
5
-
6
- ## 📌 Amaç
7
-
8
- 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.
9
-
10
- 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.
11
-
12
- 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.
13
-
14
- Flare Admin, Flare backend servisi üzerinden Spark ile entegre çalışır.
15
-
16
- ## Genel Kurallar
17
-
18
- Flare Admin, login ekranıyla başlar. Kullanıcı login olduktan sonra tanım ekranları görüntülenir.
19
-
20
- Tanım ekranları, tab window'lar şeklinde gruplandırılmıştır. Her tab'da birbiriyle alakalı işlemler yapılır.
21
-
22
- 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.
23
-
24
- Boolean alanlar ekranda (hem input olarak, hem de tablo üzerinde) checkbox olarak görüntülenir.
25
-
26
- 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.
27
-
28
- Nesnenin **deleted** alanı varsa silme işlemi fiziksel olarak yapılmaz, deleted=true olarak değiştirilir.
29
-
30
- 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.
31
-
32
- 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.
33
-
34
- 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.
35
-
36
- 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.
37
-
38
- ## Auto-save ve Undo/Redo Mekanizması
39
-
40
- - Published olmayan version'lar üzerinde çalışırken her 30 saniyede bir otomatik draft kayıt yapılır
41
- - Son 10 işlem için undo/redo desteği (Ctrl+Z / Ctrl+Y)
42
- - Draft kayıtlar drafts/ klasöründe tutulur ve UI açıldığında "Recover unsaved changes?" dialog'u gösterilir
43
-
44
- ## Klavye Kısayolları
45
-
46
- - Ctrl+S: Save
47
- - Ctrl+N: New (context'e göre project/version/intent)
48
- - Ctrl+F: Search/Filter
49
- - Ctrl+D: Duplicate
50
- - Esc: Cancel/Close dialog
51
-
52
- ## Flare Backend Düzenlemeleri
53
-
54
- Flare backend'de Flare Admin UI işleyişi için bazı eklemeler yapılması gerekiyor.
55
-
56
- ### Eklenecek endpoint'ler:
57
-
58
- #### Temel CRUD Endpoint'leri
59
-
60
- - POST /api/login - Kullanıcı girişi ve token üretimi
61
- - GET /api/environment - Environment bilgileri alma
62
- - PUT /api/environment - Environment bilgilerini kaydetme
63
- - GET /api/projects - Proje listeleme (pagination, filter, sort destekli)
64
- - 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.
65
- - PUT /api/projects/{id} - Mevcut projeyi düzenleme
66
- - DELETE /api/projects/{id} - Mevcut projeyi silme
67
- - PATCH /api/projects/{id}/toggle - Proje enable/disable
68
- - POST /api/projects/{id}/versions - Proje versiyonu oluşturma
69
- - DELETE /api/projects/{id}/versions/{version_id} - Versiyon silme
70
- - PUT /api/projects/{id}/versions/{version_id} - Versiyon düzenleme
71
- - POST /api/projects/{id}/versions/{version_id}/publish - Versiyon yayınlama
72
- - GET /api/apis - API listeleme
73
- - POST /api/apis - Yeni API ekleme
74
- - PUT /api/apis/{name} - Mevcut API'yi düzenleme
75
- - DELETE /api/apis/{name} - Mevcut API'yi silme
76
-
77
- #### Spark Integration Endpoint'leri (Yeni)
78
-
79
- - POST /api/spark/startup - Projeyi Spark'a yükle
80
- - GET /api/spark/projects - Spark proje listesi
81
- - POST /api/spark/project/enable - Projeyi aktifleştir
82
- - POST /api/spark/project/disable - Projeyi devre dışı bırak
83
- - DELETE /api/spark/project/{name} - Projeyi Spark'tan sil
84
-
85
- #### Chat Endpoint'leri (Yeni)
86
-
87
- - GET /api/projects/names - Chat için enabled proje listesi
88
- - POST /api/start_session - Chat session başlat
89
- - POST /api/chat - Mesaj gönder/al (Header: X-Session-ID)
90
-
91
- #### Ek Yardımcı Endpoint'ler
92
-
93
- - POST /api/validate/regex - Regex pattern validasyonu
94
- - POST /api/apis/test - API endpoint test etme
95
- - GET /api/projects/{id}/versions/diff - Version karşılaştırma
96
- - POST /api/projects/{id}/intents/bulk-delete - Toplu intent silme
97
- - GET /api/activity-log - Aktivite logları
98
- - POST /api/projects/import - Proje import
99
- - GET /api/projects/{id}/export - Proje export
100
- - POST /api/test/run-all - Tüm testleri çalıştır
101
- - GET /api/test/status - Test durumu sorgula
102
-
103
- ### Service_config.jsonc düzenlemeleri:
104
-
105
- ```jsonc
106
- {
107
- "config": {
108
- // Mevcut alanlar...
109
- "internal_prompt": "⚠️ **NEVER output \"#DETECTED_INTENT:\"...", // Yeni
110
- "project_id_counter": 1, // Yeni
111
- "last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
112
- "last_update_user": "admin" // Yeni
113
- },
114
-
115
- "projects": [{
116
- // Mevcut alanlar...
117
- "icon": "folder", // Yeni
118
- "description": "", // Yeni
119
- "default_language": "tr", // Yeni
120
- "supported_languages": ["tr"], // Yeni
121
- "timezone": "Europe/Istanbul", // Yeni
122
- "region": "tr-TR", // Yeni
123
- "version_id_counter": 1, // Yeni
124
- "last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
125
- "last_update_user": "admin", // Yeni
126
- "deleted": false, // Yeni
127
- "created_date": "2025-06-08T12:00:00.000Z", // Yeni
128
- "created_by": "admin", // Yeni
129
-
130
- "versions": [{
131
- // Mevcut alanlar...
132
- "last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
133
- "last_update_user": "admin", // Yeni
134
- "deleted": false, // Yeni
135
- "created_date": "2025-06-08T12:00:00.000Z", // Yeni
136
- "created_by": "admin", // Yeni
137
- "publish_date": null, // Yeni
138
- "published_by": null // Yeni
139
- }]
140
- }],
141
-
142
- "apis": [{
143
- // Mevcut alanlar...
144
- "response_mappings": [ // Yeni
145
- {
146
- "variable_name": "booking_id",
147
- "type": "str",
148
- "json_path": "confirmation.id"
149
- }
150
- ],
151
- "last_update_date": "2025-06-08T12:00:00.000Z", // Yeni
152
- "last_update_user": "admin", // Yeni
153
- "deleted": false, // Yeni
154
- "created_date": "2025-06-08T12:00:00.000Z", // Yeni
155
- "created_by": "admin" // Yeni
156
- }],
157
-
158
- // Yeni: Activity log
159
- "activity_log": [{
160
- "id": 1,
161
- "timestamp": "2025-06-08T12:00:00.000Z",
162
- "user": "admin",
163
- "action": "CREATE_PROJECT",
164
- "entity_type": "project",
165
- "entity_id": 1,
166
- "entity_name": "airline_agent",
167
- "details": "Created new project"
168
- }]
169
- }
170
-
171
- Tab Ekranları
172
- 1. User Info Tab'ı
173
- Bu tab penceresinde login olan kullanıcı mevcut şifresini değiştirebilir. Ekrandaki alanlar:
174
-
175
- Current Password (maskeli)
176
- New Password (maskeli)
177
- New Password (tekrar, maskeli)
178
- Password Strength Indicator: Şifre girilirken güvenlik seviyesini gösterir (Weak/Medium/Strong)
179
- Save butonu
180
-
181
- Ş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.
182
- 2. Environment Tab'ı
183
- Bu tab'da aşağıdaki alanlar bulunur:
184
-
185
- Work Mode: Seçenekleri hfcloud, cloud ve on-premise olan bir combo. Zorunlu.
186
- Cloud Token (maskeli): Work Mode on-premise seçildiğinde disable olur.
187
- Spark Endpoint: URL formatında. Zorunlu. Yanında "Test Connection" butonu.
188
- Internal System Prompt (Yeni): Expansion panel içinde multi-line textarea. Spark'ın tüm projeler için kullanacağı temel kuralları içerir. Placeholder'lar:
189
-
190
- <intent names>: Runtime'da intent listesiyle değiştirilir
191
- <intent captions>: Intent caption'larıyla değiştirilir
192
- <project language>: Proje diline göre değiştirilir
193
-
194
-
195
- Save butonu
196
- Reload from Spark butonu: Spark'tan güncel config'i çeker
197
-
198
- 3. APIs Tab'ı
199
- Tab açıldığında, üstte bir toolbar bulunur:
200
- Toolbar:
201
-
202
- New API butonu
203
- Import butonu: JSON dosyasından API tanımları yükler
204
- Export butonu: Seçili API'leri JSON olarak export eder
205
- Search alanı: API adı veya URL'de arama
206
- Display Deleted checkbox
207
-
208
- API Listesi Tablosu:
209
- NameURLMethodTimeoutAuthDeletedActionsbook_flight_apihttps://api.example.com/bookPOST10s✓✗🖊️ 🧪 📋 🗑️
210
- Action İkonları:
211
-
212
- 🖊️ Edit: Edit API dialog'unu açar
213
- 🧪 Test: API'yi test eder
214
- 📋 Duplicate: API'nin kopyasını oluşturur
215
- 🗑️ Delete: API'yi siler (kullanımda değilse)
216
-
217
- 4. Projects Tab'ı
218
- Tab ekranına girildiğinde üstte toolbar bulunur:
219
- Toolbar:
220
-
221
- New Project butonu
222
- Import Project butonu
223
- Search alanı
224
- Display Deleted checkbox
225
- View: List/Card view toggle
226
-
227
- Proje Listesi: Kart görünümünde her proje için:
228
- ┌─────────────────────────────────┐
229
- 🛩️ airline_agent │
230
- Havayolu Müşteri Temsilcisi │
231
- │ Language: Turkish (tr) │
232
- Versions: 3 (1 published) │
233
- │ Status: ✓ Enabled │
234
- Last update: 2 hours ago │
235
- │ [Edit] [Versions] [Export] [⚙️] │
236
- └─────────────────────────────────┘
237
- 5. Chat Tab'ı (Yeni)
238
- Flare chat sistemini test etmek için kullanılır.
239
- İşleyiş:
240
-
241
- Project Selection: Enabled ve published version'u olan projeler listelenir
242
- Start Chat: Session başlatır, session_id alır
243
- Chat Interface:
244
-
245
- Mesaj history'si
246
- Input alanı
247
- Send butonu
248
- Session bilgileri (ID, project)
249
-
250
-
251
- End Session: Chat'i sonlandırır
252
-
253
- Özellikler:
254
-
255
- Real-time mesajlaşma
256
- Session takibi
257
- Auto-scroll
258
- Error handling
259
- Loading states
260
-
261
- 6. Spark Integration Tab'ı (Yeni)
262
- Bu tab'da Spark servisi ile doğrudan etkileşim sağlanır.
263
- Üst Bölüm:
264
-
265
- Project Selection: Dropdown ile proje seçimi
266
- Proje seçildiğinde butonlar aktif olur
267
-
268
- Butonlar ve İşlevleri:
269
- Project Startup
270
-
271
- Seçili projeyi Spark'a yükler
272
- Backend üzerinden /spark/startup endpoint'ine istek atar
273
- Response'u detaylı olarak gösterir
274
-
275
- Get Project Status
276
-
277
- Spark'taki tüm projelerin durumunu listeler
278
- Tablo formatında: project_name, version, status, enabled, last_accessed
279
- Status badge'leri: ready (yeşil), loading (turuncu), error (kırmızı), unloaded (gri)
280
-
281
- Enable Project
282
-
283
- Seçili projeyi Spark'ta aktif hale getirir
284
-
285
- Disable Project
286
-
287
- Seçili projeyi Spark'ta devre dışı bırakır
288
-
289
- Delete Project
290
-
291
- Seçili projeyi Spark'tan tamamen siler
292
- Onay dialog'u gösterir
293
-
294
- Response Panel:
295
-
296
- Her işlemden sonra açılan expansion panel
297
- Request ve response JSON'larını gösterir
298
- Timestamp bilgisi
299
- Success/error durumu
300
- Son 10 işlem history'si
301
-
302
- 7. Test Tab'ı
303
- Bu tab'da sistemin end-to-end testi yapılabilir:
304
- Test Kategorileri:
305
-
306
- UI Tests: Component render, navigation, form validation
307
- Backend Tests: API endpoint'leri, data integrity
308
- Integration Tests: UI-Backend entegrasyonu
309
- Spark Tests: LLM bağlantısı ve response kalitesi
310
-
311
- Ekran Düzeni:
312
- ┌─────────────────────────────────────────────┐
313
- │ [Run All Tests] [Run Selected] [Stop] │
314
- ├─────────────────────────────────────────────┤
315
- All Tests │
316
- │ □ UI Tests (15 tests) │
317
- │ □ Login Flow │
318
- │ □ Project CRUD │
319
- │ □ Version Management │
320
- │ □ Backend Tests (22 tests) │
321
- │ □ Authentication │
322
- │ □ API Endpoints │
323
- │ □ Race Conditions │
324
- │ □ Integration Tests (18 tests) │
325
- │ □ Spark Tests (8 tests) │
326
- ├─────────────────────────────────────────────┤
327
- Test Results: │
328
- Login with valid credentials - 120ms │
329
- │ ✓ Create new project - 340ms │
330
- │ ✗ Delete API in use - Expected behavior │
331
- Testing Spark connection... │
332
- │ │
333
- │ Progress: ████████░░ 80% (48/60) │
334
- Passed: 45 | Failed: 3 | Running: 5 │
335
- └─────────────────────────────────────────────┤
336
- Test Detayları: Her test için:
337
-
338
- Test adı ve açıklaması
339
- Çalışma süresi
340
- Hata durumunda detaylı log
341
- "Re-run" butonu
342
-
343
- 8. Activity Log (Sağ üst notification icon'a tıklandığında açılır)
344
- ┌─────────────────────────────────────┐
345
- 🔔 Recent Activities │
346
- ├─────────────────────────────────────┤
347
- 2 min ago │
348
- 👤 admin published version 2 │
349
- of airline_agent │
350
- ├─────────────────────────────────────┤
351
- 15 min ago │
352
- │ 👤 user1 updated flight_info_api │
353
- ├───��─────────────────────────────────┤
354
- 1 hour ago
355
- │ 👤 admin created new project │
356
- hotel_booking
357
- ├─────────────────────────────────────┤
358
- [View All Activities]
359
- └─────────────────────────────────────┘
360
- Dialog Ekranları
361
- Edit API Dialog (Güncelleme)
362
- General Tab'a eklenenler:
363
- Response Mappings Bölümü:
364
-
365
- Variable Name: snake_case zorunlu
366
- Type: str, int, float, bool, date seçenekleri
367
- JSON Path: Dot notation ile path (örn: data.result.value)
368
- Add/Remove mapping butonları
369
- Validation: Variable name uniqueness
370
-
371
- Template Variables (Geliştirilmiş):
372
-
373
- Tüm intent parametrelerinden otomatik liste
374
- Response mapping değişkenleri
375
- Auth token değişkenleri
376
- Config değişkenleri (work_mode, vb.)
377
- Tıklanabilir chip'ler ile kolay ekleme
378
-
379
- JSON Validation (Geliştirilmiş):
380
-
381
- Numeric değişkenler için akıllı validation
382
- Template variable type checking
383
- Syntax highlighting
384
-
385
- Test Tab (Geliştirilmiş):
386
-
387
- Editable test request JSON
388
- Placeholder değerlerle doldurma
389
- Reset to template butonu
390
- Response preview
391
-
392
- Edit Project Dialog (Güncelleme)
393
- Yeni alanlar eklendi:
394
-
395
- Icon: Material icon seçimi (folder, work, shopping_cart, vb.)
396
- Description: Proje açıklaması
397
- Default Language: Varsayılan dil (tr, en, de, fr, es)
398
- Supported Languages: Desteklenen diller (çoklu seçim)
399
- Timezone: Saat dilimi (Europe/Istanbul, vb.)
400
- Region: Bölge kodu (tr-TR, vb.)
401
-
402
- Edit Version Dialog
403
- [Mevcut içerik korunacak, değişiklik yok]
404
- Edit Intent Dialog
405
- [Mevcut içerik korunacak, değişiklik yok]
406
- Edit Parameter Dialog
407
- Date type desteği eklendi:
408
-
409
- Type combo'suna "date" seçeneği
410
- Date formatı: YYYY-MM-DD (ISO format)
411
- Türkçe tarih ifadeleri için özel extraction prompt'lar
412
-
413
- Version Comparison Dialog
414
- [Mevcut içerik korunacak, değişiklik yok]
415
- Flare Admin Test Planı
416
- [Mevcut test planına ek olarak:]
417
- Spark Integration Test Senaryoları:
418
-
419
- Spark Startup Testi:
420
-
421
- Proje seç
422
- Startup butonuna bas
423
- Response'u kontrol et
424
- Get Status ile doğrula
425
-
426
-
427
- Spark Project Lifecycle:
428
-
429
- Enable Disable → Delete akışı
430
- Her adımda status kontrolü
431
- Error handling testleri
432
-
433
-
434
-
435
- Chat Test Senaryoları:
436
-
437
- Full Chat Flow:
438
-
439
- Session başlat
440
- Intent detection testi
441
- Parameter extraction testi
442
- API call testi
443
- Session sonlandır
444
-
445
-
446
- Multi-turn Conversation:
447
-
448
- Eksik parametre tamamlama
449
- Context retention
450
- Session state takibi
451
-
452
-
453
-
454
- Response Mapping Testleri:
455
-
456
- Mapping Validation:
457
-
458
- Valid/invalid variable names
459
- Type conversion testleri
460
- Nested JSON path resolution
461
-
462
-
463
- Runtime Mapping:
464
-
465
- API response'tan değer extraction
466
- Session variable update
467
- Subsequent intent'lerde kullanım
468
-
469
-
470
-
471
- Internal Prompt Testleri:
472
-
473
- Placeholder Replacement:
474
-
475
- <intent names> doğru değişiyor mu?
476
- <intent captions> doğru değişiyor mu?
477
- <project language> project default_language'den alınıyor mu?
478
-
479
-
480
- Prompt Combination:
481
-
482
- Internal prompt + general prompt birleşimi
483
- Prompt öncelik sırası
484
-
485
-
486
-
487
- Güvenlik ve Performans
488
- Token Yönetimi:
489
-
490
- SPARK_TOKEN environment variable'dan alınır
491
- Tüm Spark isteklerinde Authorization header
492
- Token rotation desteği
493
-
494
- Race Condition Handling:
495
-
496
- last_update_date kontrolü tüm CRUD işlemlerinde
497
- Concurrent edit detection
498
- Optimistic locking pattern
499
-
500
- Session Management:
501
-
502
- 30 dakika inactivity timeout
503
- Session cleanup thread
504
- Memory-efficient storage
505
-
506
- Teknoloji Stack
507
-
508
- Frontend: Angular 17+ (standalone components)
509
- UI Framework: Angular Material
510
- State Management: RxJS
511
- Backend: Python FastAPI
512
- Authentication: JWT
513
- Database: service_config.jsonc (document database pattern)
514
- LLM Integration: Spark servisi
515
-
516
- Bu güncellemelerle Flare Administration UI, tam fonksiyonel bir orchestration platform yönetim arayüzü haline gelmiştir.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.