-
Notifications
You must be signed in to change notification settings - Fork 303
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Communication: Add Artemis intelligence rewrite action for FAQs (#10157)
- Loading branch information
Showing
29 changed files
with
622 additions
and
16 deletions.
There are no files selected for viewing
97 changes: 97 additions & 0 deletions
97
src/main/java/de/tum/cit/aet/artemis/iris/service/IrisRewritingService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
package de.tum.cit.aet.artemis.iris.service; | ||
|
||
import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_IRIS; | ||
|
||
import java.util.Optional; | ||
|
||
import org.springframework.context.annotation.Profile; | ||
import org.springframework.stereotype.Service; | ||
|
||
import de.tum.cit.aet.artemis.core.domain.Course; | ||
import de.tum.cit.aet.artemis.core.domain.LLMServiceType; | ||
import de.tum.cit.aet.artemis.core.domain.User; | ||
import de.tum.cit.aet.artemis.core.repository.CourseRepository; | ||
import de.tum.cit.aet.artemis.core.repository.UserRepository; | ||
import de.tum.cit.aet.artemis.core.service.LLMTokenUsageService; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.PyrisJobService; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.PyrisPipelineService; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting.PyrisRewritingPipelineExecutionDTO; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting.PyrisRewritingStatusUpdateDTO; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting.RewritingVariant; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.job.RewritingJob; | ||
import de.tum.cit.aet.artemis.iris.service.websocket.IrisWebsocketService; | ||
|
||
/** | ||
* Service to handle the rewriting subsystem of Iris. | ||
*/ | ||
@Service | ||
@Profile(PROFILE_IRIS) | ||
public class IrisRewritingService { | ||
|
||
private final PyrisPipelineService pyrisPipelineService; | ||
|
||
private final LLMTokenUsageService llmTokenUsageService; | ||
|
||
private final CourseRepository courseRepository; | ||
|
||
private final IrisWebsocketService websocketService; | ||
|
||
private final PyrisJobService pyrisJobService; | ||
|
||
private final UserRepository userRepository; | ||
|
||
public IrisRewritingService(PyrisPipelineService pyrisPipelineService, LLMTokenUsageService llmTokenUsageService, CourseRepository courseRepository, | ||
IrisWebsocketService websocketService, PyrisJobService pyrisJobService, UserRepository userRepository) { | ||
this.pyrisPipelineService = pyrisPipelineService; | ||
this.llmTokenUsageService = llmTokenUsageService; | ||
this.courseRepository = courseRepository; | ||
this.websocketService = websocketService; | ||
this.pyrisJobService = pyrisJobService; | ||
this.userRepository = userRepository; | ||
} | ||
|
||
/** | ||
* Executes the rewriting pipeline on Pyris | ||
* | ||
* @param user the user for which the pipeline should be executed | ||
* @param course the course for which the pipeline should be executed | ||
* @param variant the rewriting variant to be used | ||
* @param toBeRewritten the text to be rewritten | ||
*/ | ||
public void executeRewritingPipeline(User user, Course course, RewritingVariant variant, String toBeRewritten) { | ||
// @formatter:off | ||
pyrisPipelineService.executePipeline( | ||
"rewriting", | ||
variant.toString(), | ||
Optional.empty(), | ||
pyrisJobService.createTokenForJob(token -> new RewritingJob(token, course.getId(), user.getId())), | ||
executionDto -> new PyrisRewritingPipelineExecutionDTO(executionDto, toBeRewritten), | ||
stages -> websocketService.send(user.getLogin(), websocketTopic(course.getId()), new PyrisRewritingStatusUpdateDTO(stages, null, null)) | ||
); | ||
// @formatter:on | ||
} | ||
|
||
/** | ||
* Takes a status update from Pyris containing a new rewriting result and sends it to the client via websocket | ||
* | ||
* @param job Job related to the status update | ||
* @param statusUpdate the status update containing text recommendations | ||
* @return the same job that was passed in | ||
*/ | ||
public RewritingJob handleStatusUpdate(RewritingJob job, PyrisRewritingStatusUpdateDTO statusUpdate) { | ||
Course course = courseRepository.findByIdForUpdateElseThrow(job.courseId()); | ||
if (statusUpdate.tokens() != null && !statusUpdate.tokens().isEmpty()) { | ||
llmTokenUsageService.saveLLMTokenUsage(statusUpdate.tokens(), LLMServiceType.IRIS, builder -> builder.withCourse(course.getId()).withUser(job.userId())); | ||
} | ||
|
||
var user = userRepository.findById(job.userId()).orElseThrow(); | ||
websocketService.send(user.getLogin(), websocketTopic(job.courseId()), statusUpdate); | ||
|
||
return job; | ||
} | ||
|
||
private static String websocketTopic(long courseId) { | ||
return "rewriting/" + courseId; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
...n/java/de/tum/cit/aet/artemis/iris/service/pyris/dto/data/PyrisRewriteTextRequestDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package de.tum.cit.aet.artemis.iris.service.pyris.dto.data; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting.RewritingVariant; | ||
|
||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public record PyrisRewriteTextRequestDTO(String toBeRewritten, RewritingVariant variant) { | ||
} |
15 changes: 15 additions & 0 deletions
15
.../cit/aet/artemis/iris/service/pyris/dto/rewriting/PyrisRewritingPipelineExecutionDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.PyrisPipelineExecutionDTO; | ||
|
||
/** | ||
* DTO to execute the Iris rewriting pipeline on Pyris | ||
* | ||
* @param execution The pipeline execution details | ||
* @param toBeRewritten The text to be rewritten | ||
*/ | ||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public record PyrisRewritingPipelineExecutionDTO(PyrisPipelineExecutionDTO execution, String toBeRewritten) { | ||
} |
21 changes: 21 additions & 0 deletions
21
...e/tum/cit/aet/artemis/iris/service/pyris/dto/rewriting/PyrisRewritingStatusUpdateDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting; | ||
|
||
import java.util.List; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
import de.tum.cit.aet.artemis.core.domain.LLMRequest; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.status.PyrisStageDTO; | ||
|
||
/** | ||
* DTO for the Iris rewriting feature. | ||
* Pyris sends callback updates back to Artemis during rewriting of the text. These updates contain the current status of the rewriting process, | ||
* which are then forwarded to the user via Websockets. | ||
* | ||
* @param stages List of stages of the generation process | ||
* @param result The result of the rewriting process so far | ||
* @param tokens List of token usages send by Pyris for tracking the token usage and cost | ||
*/ | ||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public record PyrisRewritingStatusUpdateDTO(List<PyrisStageDTO> stages, String result, List<LLMRequest> tokens) { | ||
} |
5 changes: 5 additions & 0 deletions
5
src/main/java/de/tum/cit/aet/artemis/iris/service/pyris/dto/rewriting/RewritingVariant.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package de.tum.cit.aet.artemis.iris.service.pyris.dto.rewriting; | ||
|
||
public enum RewritingVariant { | ||
FAQ, PROBLEM_STATEMENT | ||
} |
22 changes: 22 additions & 0 deletions
22
src/main/java/de/tum/cit/aet/artemis/iris/service/pyris/job/RewritingJob.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package de.tum.cit.aet.artemis.iris.service.pyris.job; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
import de.tum.cit.aet.artemis.core.domain.Course; | ||
|
||
/** | ||
* A Pyris job to rewrite a text. | ||
* | ||
* @param jobId the job id | ||
* @param courseId the course in which the rewriting is being done | ||
* @param userId the user who started the job | ||
*/ | ||
@JsonInclude(JsonInclude.Include.NON_EMPTY) | ||
public record RewritingJob(String jobId, long courseId, long userId) implements PyrisJob { | ||
|
||
@Override | ||
public boolean canAccess(Course course) { | ||
return course.getId().equals(courseId); | ||
} | ||
|
||
} |
66 changes: 66 additions & 0 deletions
66
src/main/java/de/tum/cit/aet/artemis/iris/web/IrisRewritingResource.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package de.tum.cit.aet.artemis.iris.web; | ||
|
||
import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_IRIS; | ||
|
||
import java.util.Optional; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.context.annotation.Profile; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.PathVariable; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import de.tum.cit.aet.artemis.core.repository.CourseRepository; | ||
import de.tum.cit.aet.artemis.core.repository.UserRepository; | ||
import de.tum.cit.aet.artemis.core.security.annotations.enforceRoleInCourse.EnforceAtLeastTutorInCourse; | ||
import de.tum.cit.aet.artemis.iris.service.IrisRewritingService; | ||
import de.tum.cit.aet.artemis.iris.service.pyris.dto.data.PyrisRewriteTextRequestDTO; | ||
|
||
/** | ||
* REST controller for managing Markdown Rewritings. | ||
*/ | ||
@Profile(PROFILE_IRIS) | ||
@RestController | ||
@RequestMapping("api/") | ||
public class IrisRewritingResource { | ||
|
||
private static final Logger log = LoggerFactory.getLogger(IrisRewritingResource.class); | ||
|
||
private static final String ENTITY_NAME = "rewriting"; | ||
|
||
private final UserRepository userRepository; | ||
|
||
private final CourseRepository courseRepository; | ||
|
||
private final Optional<IrisRewritingService> irisRewritingService; | ||
|
||
public IrisRewritingResource(UserRepository userRepository, CourseRepository courseRepository, Optional<IrisRewritingService> irisRewritingService) { | ||
this.userRepository = userRepository; | ||
this.courseRepository = courseRepository; | ||
this.irisRewritingService = irisRewritingService; | ||
|
||
} | ||
|
||
/** | ||
* POST /courses/{courseId}/rewrite-text : Rewrite a given text. | ||
* | ||
* @param request the request containing the text to be rewritten and the corresponding variant | ||
* @param courseId the id of the course | ||
* @return the ResponseEntity with status 200 (OK) | ||
*/ | ||
@EnforceAtLeastTutorInCourse | ||
@PostMapping("courses/{courseId}/rewrite-text") | ||
public ResponseEntity<Void> rewriteText(@RequestBody PyrisRewriteTextRequestDTO request, @PathVariable Long courseId) { | ||
var rewritingService = irisRewritingService.orElseThrow(); | ||
var user = userRepository.getUserWithGroupsAndAuthorities(); | ||
var course = courseRepository.findByIdElseThrow(courseId); | ||
rewritingService.executeRewritingPipeline(user, course, request.variant(), request.toBeRewritten()); | ||
log.debug("REST request to rewrite text: {}", request.toBeRewritten()); | ||
return ResponseEntity.ok().build(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.