Skip to content

Commit 92bc0ea

Browse files
committed
feat(model): AIModel ve Provider sınıflarına yeni alanlar eklendi; model yükleme süreci güncellendi; model-ranking.txt dosyası kaldırıldı
1 parent 9b769df commit 92bc0ea

File tree

4 files changed

+136
-97
lines changed

4 files changed

+136
-97
lines changed

user-service/src/main/java/com/craftpilot/userservice/command/ModelDataLoaderCommand.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@Component
1414
@RequiredArgsConstructor
1515
@Slf4j
16-
@ConditionalOnProperty(name = "spring.load-models", havingValue = "true")
16+
@ConditionalOnProperty(name = "spring.load-models", havingValue = "true", matchIfMissing = true)
1717
public class ModelDataLoaderCommand implements CommandLineRunner {
1818

1919
private final ModelDataLoader modelDataLoader;
@@ -26,21 +26,27 @@ public class ModelDataLoaderCommand implements CommandLineRunner {
2626

2727
@Override
2828
public void run(String... args) {
29-
log.info("Başlangıçta model yükleme etkin. '{}' dosyasından modeller yükleniyor", modelsFile);
29+
log.info("CommandLineRunner ile model yükleme başlatılıyor. '{}' dosyasından modeller yükleniyor", modelsFile);
3030

3131
// Dosya yolunu belirle
3232
String jsonFilePath = args.length > 0 && args[0] != null && !args[0].isEmpty() ?
3333
args[0] : modelsFile;
3434

35-
// Modelleri yükle ve işlem tamamlanana kadar bekle
36-
modelDataLoader.loadModelsFromJson(jsonFilePath)
37-
.timeout(Duration.ofSeconds(loadTimeoutSeconds))
38-
.doOnSuccess(count -> {
39-
log.info("AI model yükleme işlemi tamamlandı: {} model yüklendi", count);
40-
})
41-
.doOnError(error -> {
42-
log.error("AI model yükleme sırasında hata: {}", error.getMessage(), error);
43-
})
44-
.block(Duration.ofSeconds(loadTimeoutSeconds + 10)); // Bloke etme süresi timeout + 10 saniye
35+
try {
36+
// Modelleri yükle ve işlem tamamlanana kadar bekle
37+
Integer count = modelDataLoader.loadModelsFromJson(jsonFilePath)
38+
.timeout(Duration.ofSeconds(loadTimeoutSeconds))
39+
.doOnSuccess(loadedCount -> {
40+
log.info("CommandLineRunner: AI model yükleme işlemi tamamlandı: {} model yüklendi", loadedCount);
41+
})
42+
.doOnError(error -> {
43+
log.error("CommandLineRunner: AI model yükleme sırasında hata: {}", error.getMessage(), error);
44+
})
45+
.block(Duration.ofSeconds(loadTimeoutSeconds + 10)); // Bloke etme süresi timeout + 10 saniye
46+
47+
log.info("CommandLineRunner: Model yükleme işlemi sonucu: {} model yüklendi", count != null ? count : 0);
48+
} catch (Exception e) {
49+
log.error("CommandLineRunner: Model yükleme işlemi sırasında beklenmeyen hata: {}", e.getMessage(), e);
50+
}
4551
}
4652
}

user-service/src/main/java/com/craftpilot/userservice/service/ModelDataLoader.java

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import lombok.RequiredArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
1111
import org.springframework.core.io.ClassPathResource;
12+
import org.springframework.core.io.FileSystemResource;
1213
import org.springframework.core.io.Resource;
1314
import org.springframework.core.io.ResourceLoader;
1415
import org.springframework.dao.DuplicateKeyException;
1516
import org.springframework.stereotype.Service;
1617
import reactor.core.publisher.Flux;
1718
import reactor.core.publisher.Mono;
1819

20+
import jakarta.annotation.PostConstruct;
1921
import java.io.IOException;
2022
import java.nio.charset.StandardCharsets;
2123
import java.nio.file.Files;
@@ -35,6 +37,35 @@ public class ModelDataLoader {
3537
private final ModelDataFixer modelDataFixer;
3638
private final ResourceLoader resourceLoader;
3739

40+
/**
41+
* Uygulama başlangıcında varsayılan modelleri yükler
42+
*/
43+
@PostConstruct
44+
public void loadDefaultModels() {
45+
log.info("Varsayılan modelleri yükleme girişimi başlatılıyor");
46+
47+
// Önce model sayısını kontrol et, eğer veri zaten varsa tekrar yükleme
48+
modelRepository.count()
49+
.flatMap(modelCount -> {
50+
if (modelCount > 0) {
51+
log.info("Veritabanında zaten {} model var, yeniden yükleme yapılmayacak", modelCount);
52+
return Mono.just(0);
53+
}
54+
55+
log.info("Veritabanında hiç model yok, varsayılan modelleri yüklüyorum");
56+
return loadModelsFromJson("newmodels.json")
57+
.onErrorResume(e -> {
58+
log.error("Varsayılan model yükleme hatası: {}", e.getMessage(), e);
59+
// Alternatif dosya adı dene
60+
return loadModelsFromJson("classpath:newmodels.json");
61+
});
62+
})
63+
.subscribe(
64+
count -> log.info("Varsayılan model yükleme işlemi tamamlandı: {} model yüklendi", count),
65+
error -> log.error("Varsayılan model yükleme hatası: {}", error.getMessage(), error)
66+
);
67+
}
68+
3869
/**
3970
* JSON dosyasından model verilerini yükler
4071
*
@@ -67,9 +98,12 @@ public Mono<Integer> loadModelsFromJson(String jsonFilePath) {
6798
private Mono<Integer> saveAllProvidersThenModels(List<Provider> providers, List<AIModel> models) {
6899
AtomicInteger savedModelsCount = new AtomicInteger(0);
69100

101+
// Önce provider'ları kaydet, sonra modelleri kaydet
70102
return Flux.fromIterable(providers)
71-
.flatMap(provider -> saveProvider(provider))
103+
.flatMap(this::saveProvider)
72104
.collectList()
105+
.doOnSuccess(savedProviders ->
106+
log.info("{} provider başarıyla kaydedildi", savedProviders.size()))
73107
.flatMapMany(savedProviders -> Flux.fromIterable(models))
74108
.concatMap(model -> saveModel(model, savedModelsCount))
75109
.then(Mono.just(savedModelsCount.get()))
@@ -80,6 +114,11 @@ private Mono<Integer> saveAllProvidersThenModels(List<Provider> providers, List<
80114
* Provider'ı kaydeder, zaten varsa var olanı döndürür
81115
*/
82116
private Mono<Provider> saveProvider(Provider provider) {
117+
if (provider.getName() == null || provider.getName().trim().isEmpty()) {
118+
log.warn("Geçersiz provider ismi, atlanan provider: {}", provider);
119+
return Mono.empty();
120+
}
121+
83122
return providerRepository.findByName(provider.getName())
84123
.flatMap(existingProvider -> {
85124
log.info("Provider '{}' zaten var, yeniden kullanılıyor", provider.getName());
@@ -89,6 +128,9 @@ private Mono<Provider> saveProvider(Provider provider) {
89128
providerRepository.save(provider)
90129
.doOnSuccess(savedProvider ->
91130
log.info("Yeni provider kaydedildi: {}", savedProvider.getName()))
131+
.doOnError(e ->
132+
log.error("Provider '{}' kaydedilirken hata: {}",
133+
provider.getName(), e.getMessage()))
92134
);
93135
}
94136

@@ -132,32 +174,38 @@ private Mono<AIModel> saveModel(AIModel model, AtomicInteger counter) {
132174
*/
133175
private Mono<String> readJsonContent(String jsonFilePath) {
134176
try {
177+
Resource resource;
178+
135179
if (jsonFilePath.startsWith("classpath:")) {
136-
String resourcePath = jsonFilePath.replace("classpath:", "");
137-
Resource resource = resourceLoader.getResource("classpath:" + resourcePath);
138-
139-
log.info("Modeller classpath kaynağından yükleniyor: {}", resource.getURL());
140-
141-
try (var inputStream = resource.getInputStream()) {
142-
byte[] bytes = inputStream.readAllBytes();
143-
return Mono.just(new String(bytes, StandardCharsets.UTF_8));
144-
}
180+
// ClassPath kaynaklarını yükle
181+
resource = resourceLoader.getResource(jsonFilePath);
182+
} else if (Files.exists(Paths.get(jsonFilePath))) {
183+
// Dosya sisteminden yükle
184+
resource = new FileSystemResource(jsonFilePath);
145185
} else {
146-
Path path = Paths.get(jsonFilePath);
147-
if (Files.exists(path)) {
148-
log.info("Modeller dosya sisteminden yükleniyor: {}", path.toAbsolutePath());
149-
return Mono.just(Files.readString(path));
150-
} else {
151-
// Dosya bulunamadı, ClassPathResource olarak dene
152-
ClassPathResource resource = new ClassPathResource(jsonFilePath);
153-
log.info("Modeller ClassPathResource'dan yükleniyor: {}", resource.getURL());
154-
155-
try (var inputStream = resource.getInputStream()) {
156-
byte[] bytes = inputStream.readAllBytes();
157-
return Mono.just(new String(bytes, StandardCharsets.UTF_8));
186+
// Önce sınıf yolunda ara
187+
resource = new ClassPathResource(jsonFilePath);
188+
if (!resource.exists()) {
189+
// Sonra resources klasöründe ara
190+
resource = resourceLoader.getResource("classpath:" + jsonFilePath);
191+
if (!resource.exists()) {
192+
throw new IOException("Dosya bulunamadı: " + jsonFilePath);
158193
}
159194
}
160195
}
196+
197+
log.info("Model dosyası bulundu: {}", resource.getURL());
198+
199+
try (var inputStream = resource.getInputStream()) {
200+
byte[] bytes = inputStream.readAllBytes();
201+
String content = new String(bytes, StandardCharsets.UTF_8);
202+
203+
if (content.isEmpty()) {
204+
throw new IOException("JSON dosyası boş");
205+
}
206+
207+
return Mono.just(content);
208+
}
161209
} catch (IOException e) {
162210
log.error("JSON dosyası okunamadı: {}", e.getMessage(), e);
163211
return Mono.error(e);

user-service/src/main/java/com/craftpilot/userservice/util/ModelDataFixer.java

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,44 @@ public Map<String, Object> validateAndFixModelData(String jsonContent) {
3636

3737
JsonNode rootNode = objectMapper.readTree(jsonContent);
3838

39+
// Root elementinin bir array olduğunu kontrol et
40+
if (!rootNode.isArray()) {
41+
log.error("JSON içeriği bir dizi olmalıdır, ancak şu tipte: {}", rootNode.getNodeType());
42+
throw new RuntimeException("JSON content must be an array");
43+
}
44+
45+
log.info("Toplam {} model girişi bulundu", rootNode.size());
46+
3947
for (JsonNode modelNode : rootNode) {
40-
// Özel model formatını kontrol et
41-
if (modelNode.has("provider") && modelNode.has("models") && modelNode.has("contextLength")) {
42-
// Bu, özel bir model formatı - models array'i içerir
43-
processProviderModelsFormat(modelNode, fixedModels, providers);
44-
} else if (modelNode.has("modelId") && modelNode.has("modelName") && modelNode.has("provider")) {
45-
// Standart model formatı
46-
AIModel model = processStandardModelFormat(modelNode);
47-
if (model != null) {
48-
fixedModels.add(model);
49-
50-
// Provider bilgisini sakla
51-
String providerName = modelNode.get("provider").asText();
52-
if (!providers.containsKey(providerName)) {
53-
Provider provider = Provider.builder()
54-
.name(providerName)
55-
.build();
56-
providers.put(providerName, provider);
48+
try {
49+
// Özel model formatını kontrol et
50+
if (modelNode.has("provider") && modelNode.has("models") && modelNode.has("contextLength")) {
51+
// Bu, özel bir model formatı - models array'i içerir
52+
log.debug("Özel format model işleniyor: {}", modelNode.get("provider").asText());
53+
processProviderModelsFormat(modelNode, fixedModels, providers);
54+
} else if (modelNode.has("modelId") && (modelNode.has("modelName") || modelNode.has("name")) && modelNode.has("provider")) {
55+
// Standart model formatı
56+
log.debug("Standart format model işleniyor: {}",
57+
modelNode.has("modelId") ? modelNode.get("modelId").asText() : "bilinmeyen");
58+
AIModel model = processStandardModelFormat(modelNode);
59+
if (model != null) {
60+
fixedModels.add(model);
61+
62+
// Provider bilgisini sakla
63+
String providerName = modelNode.get("provider").asText();
64+
if (!providers.containsKey(providerName)) {
65+
Provider provider = Provider.builder()
66+
.name(providerName)
67+
.build();
68+
providers.put(providerName, provider);
69+
}
5770
}
71+
} else {
72+
log.warn("Tanınmayan model formatı, atlanan model: {}", modelNode);
5873
}
74+
} catch (Exception e) {
75+
log.error("Model işlenirken hata: {}", e.getMessage());
76+
// Hata durumunda bu modeli atla, diğer modeller ile devam et
5977
}
6078
}
6179

@@ -82,8 +100,11 @@ private void processProviderModelsFormat(JsonNode modelNode, List<AIModel> model
82100
if (!providers.containsKey(providerName)) {
83101
Provider provider = Provider.builder()
84102
.name(providerName)
103+
.icon(modelNode.has("icon") ? modelNode.get("icon").asText() : null)
104+
.description(modelNode.has("description") ? modelNode.get("description").asText() : null)
85105
.build();
86106
providers.put(providerName, provider);
107+
log.debug("Yeni provider oluşturuldu: {}", providerName);
87108
}
88109

89110
// Her bir alt model için AIModel oluştur
@@ -104,17 +125,25 @@ private void processProviderModelsFormat(JsonNode modelNode, List<AIModel> model
104125
.creditCost(1)
105126
.creditType("STANDARD")
106127
.category("FREE")
128+
.isActive(true)
107129
.build();
108130

109131
models.add(model);
132+
log.debug("Alt model eklendi: {} - {}", modelId, name);
110133
}
111134
}
112135
}
113136
}
114137

115138
private AIModel processStandardModelFormat(JsonNode modelNode) {
116139
String modelId = modelNode.has("modelId") ? modelNode.get("modelId").asText() : null;
117-
String modelName = modelNode.has("modelName") ? modelNode.get("modelName").asText() : null;
140+
// modelName veya name alanını kontrol et
141+
String modelName = null;
142+
if (modelNode.has("modelName")) {
143+
modelName = modelNode.get("modelName").asText();
144+
} else if (modelNode.has("name")) {
145+
modelName = modelNode.get("name").asText();
146+
}
118147
String provider = modelNode.has("provider") ? modelNode.get("provider").asText() : null;
119148

120149
// Model ID, isim veya provider boşsa bu modeli atla
@@ -133,6 +162,7 @@ private AIModel processStandardModelFormat(JsonNode modelNode) {
133162
.creditType(modelNode.has("creditType") ? modelNode.get("creditType").asText() : "STANDARD")
134163
.category(modelNode.has("category") ? modelNode.get("category").asText() : "FREE")
135164
.contextLength(modelNode.has("contextLength") ? modelNode.get("contextLength").asInt() : 8000)
165+
.isActive(true)
136166
.build();
137167
}
138168
}

user-service/src/main/resources/model-ranking.txt

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)