Spaces:
Running
Running
Upload 2 files
Browse files- flare-tasarim.md +379 -0
- flare-ui-tasarim.md +516 -0
flare-tasarim.md
ADDED
@@ -0,0 +1,379 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
}
|
flare-ui-tasarim.md
ADDED
@@ -0,0 +1,516 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|