View Javadoc
1   package fr.tiogars.chat.domains.prompt.services;
2   
3   import fr.tiogars.chat.domains.prompt.entities.PromptEntity;
4   import fr.tiogars.chat.domains.prompt.models.PromptRequest;
5   import fr.tiogars.chat.domains.prompt.models.PromptResponse;
6   import fr.tiogars.chat.domains.prompt.repositories.PromptRepository;
7   import org.springframework.stereotype.Service;
8   
9   import java.time.Duration;
10  import java.time.Instant;
11  import java.util.UUID;
12  
13  /**
14   * Service for handling AI prompts with persistence.
15   * This service saves all prompts and responses to the database.
16   */
17  @Service
18  public class PromptPersistenceService {
19  
20      private final ChatClientAdapter chatClient;
21      private final PromptRepository promptRepository;
22  
23      public PromptPersistenceService(ChatClientAdapter chatClient, PromptRepository promptRepository) {
24          this.chatClient = chatClient;
25          this.promptRepository = promptRepository;
26      }
27  
28      /**
29       * Process a prompt request, save it to the database, and return the AI response.
30       *
31       * @param request the prompt request
32       * @param userId the user ID (can be null for anonymous users)
33       * @param sessionId the session ID (can be null for no session)
34       * @return the AI response
35       */
36      public PromptResponse processAndSavePrompt(PromptRequest request, UUID userId, String sessionId) {
37          Instant start = Instant.now();
38  
39          String response;
40          if (request.systemPrompt() != null && !request.systemPrompt().isBlank()) {
41              response = chatClient.call(request.systemPrompt(), request.prompt());
42          } else {
43              response = chatClient.call(request.prompt());
44          }
45  
46          Instant end = Instant.now();
47          long processingTimeMs = Duration.between(start, end).toMillis();
48  
49          // Save the prompt and response to the database
50          PromptEntity entity = new PromptEntity(
51                  request.prompt(),
52                  request.systemPrompt(),
53                  response,
54                  request.model() != null ? request.model() : "unknown",
55                  response.length(),
56                  processingTimeMs,
57                  "stop",
58                  sessionId,
59                  userId
60          );
61          promptRepository.save(entity);
62  
63          return new PromptResponse(
64                  response,
65                  request.model() != null ? request.model() : "unknown",
66                  response.length(),
67                  processingTimeMs,
68                  "stop"
69          );
70      }
71  
72      /**
73       * Process a prompt without saving it to the database.
74       *
75       * @param request the prompt request
76       * @return the AI response
77       */
78      public PromptResponse processPrompt(PromptRequest request) {
79          return processAndSavePrompt(request, null, null);
80      }
81  }