Skip to content

Commit 573e563

Browse files
committed
feat(model): AIModel sınıfına yeni alanlar eklendi ve ModelDataLoader yapılandırması güncellendi
1 parent cbf74d9 commit 573e563

File tree

3 files changed

+119
-52
lines changed

3 files changed

+119
-52
lines changed

user-service/src/main/java/com/craftpilot/userservice/model/ai/AIModel.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
77
import org.springframework.data.annotation.Id;
8-
import org.springframework.data.mongodb.core.index.Indexed;
98
import org.springframework.data.mongodb.core.mapping.Document;
109

1110
@Data
@@ -16,27 +15,21 @@
1615
public class AIModel {
1716
@Id
1817
private String id;
19-
20-
@Indexed
2118
private String modelId;
2219
private String modelName;
2320
private String provider;
24-
private String providerId; // Provider ID için yeni alan ekliyoruz
2521
private Integer maxInputTokens;
2622
private String requiredPlan;
27-
private Integer creditCost; // Her kullanımda tüketilecek kredi miktarı
28-
private String creditType; // Kredi tipi (STANDARD veya ADVANCED)
29-
30-
@Indexed
31-
private String category; // Model kategorisi (basic, standard, premium gibi)
32-
private Integer contextLength; // Modelin bağlam penceresi uzunluğu
33-
34-
// providerId için getter ve setter metotları
35-
public String getProviderId() {
36-
return providerId;
37-
}
38-
39-
public void setProviderId(String providerId) {
40-
this.providerId = providerId;
41-
}
23+
private Integer creditCost;
24+
private String creditType;
25+
private String category;
26+
private Integer contextLength;
27+
private Double defaultTemperature;
28+
private String icon;
29+
private String description;
30+
private Double fee;
31+
private Boolean featured;
32+
private Integer maxTokens;
33+
private Boolean multimodal;
34+
private Boolean active;
4235
}

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

Lines changed: 105 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import java.nio.file.Files;
2121
import java.nio.file.Path;
2222
import java.nio.file.Paths;
23+
import java.util.ArrayList;
2324
import 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
}

user-service/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ user-preference:
200200
# AI Model yapılandırmaları
201201
app:
202202
load-models: ${LOAD_MODELS:true}
203+
mongodb:
204+
create-indexes: ${MONGODB_CREATE_INDEXES:false}
203205
models:
204206
file: ${MODELS_FILE:newmodels.json}
205207
version: ${MODELS_VERSION:1}

0 commit comments

Comments
 (0)