2020import java .nio .file .Files ;
2121import java .nio .file .Path ;
2222import java .nio .file .Paths ;
23+ import java .util .ArrayList ;
2324import java .util .List ;
25+ import java .util .concurrent .atomic .AtomicInteger ;
2426
2527@ Service
2628@ Slf4j
@@ -31,10 +33,10 @@ public class ModelDataLoader {
3133 private final AIModelRepository modelRepository ;
3234 private final ObjectMapper objectMapper ;
3335
34- @ Value ("${spring .models.file:newmodels.json}" )
36+ @ Value ("${app .models.file:newmodels.json}" )
3537 private String modelsFile ;
3638
37- @ Value ("${spring .load-models:false}" )
39+ @ Value ("${app .load-models:false}" )
3840 private boolean loadModelsEnabled ;
3941
4042 /**
@@ -44,7 +46,7 @@ public class ModelDataLoader {
4446 @ PostConstruct
4547 public void loadModelsOnStartup () {
4648 if (!loadModelsEnabled ) {
47- log .info ("Otomatik model yükleme devre dışı bırakılmış (spring .load-models=false)" );
49+ log .info ("Otomatik model yükleme devre dışı bırakılmış (app .load-models=false)" );
4850 return ;
4951 }
5052
@@ -53,7 +55,7 @@ public void loadModelsOnStartup() {
5355 loadModels (modelsFile )
5456 .subscribe (
5557 count -> log .info ("{} adet model başarıyla yüklendi" , count ),
56- error -> log .error ("Model yükleme sırasında hata oluştu: {}" , error .getMessage ()));
58+ error -> log .error ("Model yükleme sırasında hata oluştu: {}" , error .getMessage (), error ));
5759 }
5860
5961 public Mono <Integer > loadModels (String configuredPath ) {
@@ -80,53 +82,123 @@ public Mono<Integer> loadModels(String configuredPath) {
8082 return Mono .error (new IOException ("Model dosyası bulunamadı: " + filePath .toAbsolutePath ()));
8183 }
8284
83- log .info ("Models loading from file system : {}" , filePath .toAbsolutePath ());
85+ log .info ("Modeller dosya sisteminden yükleniyor : {}" , filePath .toAbsolutePath ());
8486 String jsonContent = Files .readString (filePath );
8587 return processJsonContent (jsonContent );
8688 } else {
8789 // Classpath'ten yükle
88- log .info ("Models loading from classpath resource : {}" , resource .getURL ());
90+ log .info ("Modeller classpath kaynağından yükleniyor : {}" , resource .getURL ());
8991 try (InputStream is = resource .getInputStream ()) {
9092 String jsonContent = new String (is .readAllBytes (), java .nio .charset .StandardCharsets .UTF_8 );
9193 return processJsonContent (jsonContent );
9294 }
9395 }
9496 } catch (IOException e ) {
95- log .error ("JSON model verisi yüklenirken hata: {}" , e .getMessage ());
97+ log .error ("JSON model verisi yüklenirken hata: {}" , e .getMessage (), e );
9698 return Mono .error (e );
9799 }
98100 }
99101
100102 private Mono <Integer > processJsonContent (String jsonContent ) {
101103 try {
102- List <Provider > providers = objectMapper .readValue (
104+ log .debug ("JSON içeriği işleniyor" );
105+ List <Object > jsonObjects = objectMapper .readValue (
103106 jsonContent ,
104- new TypeReference <List <Provider >>() {
105- });
106-
107- return Flux .fromIterable (providers )
108- .flatMap (provider -> {
109- List <AIModel > models = provider .getModels ();
110- provider .setModels (null );
111-
112- return providerRepository .save (provider )
113- .flatMapMany (savedProvider -> {
114- if (models != null ) {
115- return Flux .fromIterable (models )
116- .map (model -> {
117- // AIModel.provider alanını kullanarak providerId'yi tanımlama
118- model .setProvider (savedProvider .getName ());
119- return model ;
120- })
121- .flatMap (modelRepository ::save );
122- }
123- return Flux .empty ();
124- });
125- })
126- .count ()
127- .map (Long ::intValue );
107+ new TypeReference <List <Object >>() {});
108+
109+ AtomicInteger modelCount = new AtomicInteger (0 );
110+ List <Mono <Void >> processTasks = new ArrayList <>();
111+
112+ for (Object obj : jsonObjects ) {
113+ try {
114+ // Her bir JSON objesini ayrı ayrı değerlendir
115+ if (obj instanceof java .util .Map ) {
116+ java .util .Map <String , Object > itemMap = (java .util .Map <String , Object >) obj ;
117+
118+ // Meta provider gibi özel formatlar için
119+ if (itemMap .containsKey ("provider" ) && itemMap .containsKey ("models" ) && itemMap .get ("models" ) instanceof List ) {
120+ String providerName = (String ) itemMap .get ("provider" );
121+ Integer contextLength = itemMap .containsKey ("contextLength" ) ?
122+ ((Number )itemMap .get ("contextLength" )).intValue () : null ;
123+
124+ Provider provider = Provider .builder ()
125+ .name (providerName )
126+ .build ();
127+
128+ // Provider kaydetme
129+ Mono <Void > providerTask = providerRepository .save (provider )
130+ .flatMap (savedProvider -> {
131+ List <Object > modelsList = (List <Object >) itemMap .get ("models" );
132+ List <Mono <AIModel >> modelSaveOps = new ArrayList <>();
133+
134+ for (Object modelObj : modelsList ) {
135+ if (modelObj instanceof java .util .Map ) {
136+ java .util .Map <String , Object > modelMap = (java .util .Map <String , Object >) modelObj ;
137+
138+ AIModel model = AIModel .builder ()
139+ .id (String .valueOf (modelMap .get ("modelId" )))
140+ .modelId (String .valueOf (modelMap .get ("modelId" )))
141+ .modelName (String .valueOf (modelMap .get ("name" )))
142+ .provider (savedProvider .getName ())
143+ .maxInputTokens (modelMap .containsKey ("maxTokens" ) ?
144+ ((Number )modelMap .get ("maxTokens" )).intValue () : 8000 )
145+ .contextLength (contextLength != null ? contextLength : 131072 )
146+ .build ();
147+
148+ modelSaveOps .add (modelRepository .save (model )
149+ .doOnSuccess (m -> modelCount .incrementAndGet ()));
150+ }
151+ }
152+
153+ return Flux .concat (modelSaveOps ).then ();
154+ })
155+ .then ();
156+
157+ processTasks .add (providerTask );
158+ }
159+ // Normal model objeleri için
160+ else if (itemMap .containsKey ("id" ) && itemMap .containsKey ("modelId" )) {
161+ AIModel model = objectMapper .convertValue (obj , AIModel .class );
162+
163+ // Eğer provider yoksa varsayılan bir değer belirle
164+ if (model .getProvider () == null && itemMap .containsKey ("provider" )) {
165+ model .setProvider ((String ) itemMap .get ("provider" ));
166+ }
167+
168+ // Provider'ı kaydet
169+ Provider provider = Provider .builder ()
170+ .name (model .getProvider ())
171+ .build ();
172+
173+ Mono <Void > modelTask = providerRepository .save (provider )
174+ .then (modelRepository .save (model ))
175+ .doOnSuccess (savedModel -> {
176+ modelCount .incrementAndGet ();
177+ log .debug ("Model kaydedildi: {}" , savedModel .getModelId ());
178+ })
179+ .then ();
180+
181+ processTasks .add (modelTask );
182+ } else {
183+ log .warn ("Desteklenmeyen model format, atlanıyor: {}" , itemMap );
184+ }
185+ }
186+ } catch (Exception e ) {
187+ log .error ("Tek bir model işlenirken hata: {}" , e .getMessage (), e );
188+ // Hatayı yut ve diğer modelleri işlemeye devam et
189+ }
190+ }
191+
192+ if (processTasks .isEmpty ()) {
193+ log .warn ("İşlenecek model bulunamadı" );
194+ return Mono .just (0 );
195+ }
196+
197+ return Flux .concat (processTasks )
198+ .then (Mono .just (modelCount .get ()));
199+
128200 } catch (Exception e ) {
129- log .error ("JSON model verisi işlenirken hata: {}" , e .getMessage ());
201+ log .error ("JSON model verisi işlenirken hata: {}" , e .getMessage (), e );
130202 return Mono .error (e );
131203 }
132204 }
0 commit comments