60 lines
2.7 KiB
Java
60 lines
2.7 KiB
Java
/*
|
|
* Copyright 2025 Google. This software is provided as-is, without warranty or representation for any use or purpose.
|
|
* Your use of it is subject to your agreement with Google.
|
|
*/
|
|
|
|
package com.example.service.base;
|
|
|
|
import com.example.exception.GeminiClientException;
|
|
import com.google.genai.Client;
|
|
import com.google.genai.errors.GenAiIOException;
|
|
import com.google.genai.types.Content;
|
|
import com.google.genai.types.GenerateContentConfig;
|
|
import com.google.genai.types.GenerateContentResponse;
|
|
import com.google.genai.types.Part;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
/**
|
|
* Service for interacting with the Gemini API to generate content.
|
|
* It encapsulates the low-level API calls, handling prompt configuration,
|
|
* and error management to provide a clean and robust content generation interface.
|
|
*/
|
|
@Service
|
|
public class GeminiClientService {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(GeminiClientService.class);
|
|
private final Client geminiClient;
|
|
|
|
public GeminiClientService(Client geminiClient) {
|
|
this.geminiClient = geminiClient;
|
|
}
|
|
|
|
public String generateContent(String prompt, Float temperature, Integer maxOutputTokens, String modelName,Float topP) throws GeminiClientException {
|
|
try {
|
|
Content content = Content.fromParts(Part.fromText(prompt));
|
|
GenerateContentConfig config = GenerateContentConfig.builder()
|
|
.temperature(temperature)
|
|
.maxOutputTokens(maxOutputTokens)
|
|
.topP(topP)
|
|
.build();
|
|
|
|
logger.debug("Sending request to Gemini model '{}'", modelName);
|
|
GenerateContentResponse response = geminiClient.models.generateContent(modelName, content, config);
|
|
|
|
if (response != null && response.text() != null) {
|
|
return response.text();
|
|
} else {
|
|
logger.warn("Gemini returned no content or an unexpected response structure for model '{}'.", modelName);
|
|
throw new GeminiClientException("No content generated or unexpected response structure.");
|
|
}
|
|
} catch (GenAiIOException e) {
|
|
logger.error("Gemini API I/O error while calling model '{}': {}", modelName, e.getMessage(), e);
|
|
throw new GeminiClientException("An API communication issue occurred: " + e.getMessage(), e);
|
|
} catch (Exception e) {
|
|
logger.error("An unexpected error occurred during Gemini content generation for model '{}': {}", modelName, e.getMessage(), e);
|
|
throw new GeminiClientException("An unexpected issue occurred during content generation.", e);
|
|
}
|
|
}
|
|
} |