Skip to content

Commit

Permalink
Iris: Get offered models from Pyris (#6886)
Browse files Browse the repository at this point in the history
  • Loading branch information
SolizerCodes authored Jul 18, 2023
1 parent 32b022b commit 04f1c2b
Show file tree
Hide file tree
Showing 25 changed files with 206 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

import de.tum.in.www1.artemis.domain.DomainObject;
import de.tum.in.www1.artemis.domain.iris.IrisTemplate;
import de.tum.in.www1.artemis.service.connectors.iris.IrisModel;

/**
* An IrisSubSettings object represents the settings for a specific feature of Iris.
Expand All @@ -31,8 +30,7 @@ public class IrisSubSettings extends DomainObject {

@Nullable
@Column(name = "preferredModel")
@Enumerated(EnumType.STRING)
private IrisModel preferredModel;
private String preferredModel;

public boolean isEnabled() {
return enabled;
Expand All @@ -52,11 +50,11 @@ public void setTemplate(@Nullable IrisTemplate template) {
}

@Nullable
public IrisModel getPreferredModel() {
public String getPreferredModel() {
return preferredModel;
}

public void setPreferredModel(@Nullable IrisModel preferredModel) {
public void setPreferredModel(@Nullable String preferredModel) {
this.preferredModel = preferredModel;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package de.tum.in.www1.artemis.service.connectors.iris;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

Expand All @@ -19,6 +21,7 @@
import de.tum.in.www1.artemis.domain.iris.IrisTemplate;
import de.tum.in.www1.artemis.service.connectors.iris.dto.IrisErrorResponseDTO;
import de.tum.in.www1.artemis.service.connectors.iris.dto.IrisMessageResponseDTO;
import de.tum.in.www1.artemis.service.connectors.iris.dto.IrisModelDTO;
import de.tum.in.www1.artemis.service.connectors.iris.dto.IrisRequestDTO;
import de.tum.in.www1.artemis.service.iris.exception.*;

Check warning on line 26 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/IrisConnectorService.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/IrisConnectorService.java#L26

Star import of `de.tum.in.www1.artemis.service.iris.exception.*` should not be used https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=E8F99B6FB2DCE5AF312C5917A44574E2

Expand Down Expand Up @@ -50,14 +53,27 @@ public IrisConnectorService(@Qualifier("irisRestTemplate") RestTemplate restTemp
* not reachable)
* @param parameters A map of parameters to be included in the template through handlebars (if they are specified
* in the template)
* @return The message response to the request which includes the {@link de.tum.in.www1.artemis.domain.iris.IrisMessage} and the used {@link IrisModel}
* @return The message response to the request which includes the {@link de.tum.in.www1.artemis.domain.iris.IrisMessage} and the used IrisModel
*/
@Async
public CompletableFuture<IrisMessageResponseDTO> sendRequest(IrisTemplate template, IrisModel preferredModel, Map<String, Object> parameters) {
public CompletableFuture<IrisMessageResponseDTO> sendRequest(IrisTemplate template, String preferredModel, Map<String, Object> parameters) {
var request = new IrisRequestDTO(template, preferredModel, parameters);
return sendRequest(request);
}

/**
* Requests all available models from Pyris
*
* @return A list of available Models as IrisModelDTO
*/
public List<IrisModelDTO> getOfferedModels() throws IrisConnectorException {
var response = restTemplate.getForEntity(irisUrl + "/api/v1/models", JsonNode.class);
if (!response.getStatusCode().is2xxSuccessful() || !response.hasBody()) {
throw new IrisConnectorException("Could not fetch offered models");
}
return Arrays.asList((IrisModelDTO[]) parseResponse(response.getBody(), IrisModelDTO.class.arrayType()));
}

private CompletableFuture<IrisMessageResponseDTO> sendRequest(IrisRequestDTO request) {
try {
try {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.tum.in.www1.artemis.service.connectors.iris.dto;

import de.tum.in.www1.artemis.domain.iris.IrisMessage;
import de.tum.in.www1.artemis.service.connectors.iris.IrisModel;

public record IrisMessageResponseDTO(IrisModel usedModel, IrisMessage message) {
public record IrisMessageResponseDTO(String usedModel, IrisMessage message) {
}

Check warning on line 6 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisMessageResponseDTO.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisMessageResponseDTO.java#L5-L6

Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=6364DDEC5A646C436BDBD07120773C5B
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package de.tum.in.www1.artemis.service.connectors.iris.dto;

public record IrisModelDTO(String id, String name, String description) {
}

Check warning on line 4 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisModelDTO.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisModelDTO.java#L3-L4

[New] Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=CAB802614EBC733E9AFD06C132920056
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.util.Map;

import de.tum.in.www1.artemis.domain.iris.IrisTemplate;
import de.tum.in.www1.artemis.service.connectors.iris.IrisModel;

public record IrisRequestDTO(IrisTemplate template, IrisModel preferredModel, Map<String, Object> parameters) {
public record IrisRequestDTO(IrisTemplate template, String preferredModel, Map<String, Object> parameters) {
}

Check warning on line 8 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisRequestDTO.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisRequestDTO.java#L7-L8

Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=9777292E22843C5A94A5B51F17C686D4
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

import java.util.Map;

import de.tum.in.www1.artemis.service.connectors.iris.IrisModel;

public record IrisStatusDTO(Map<IrisModel, ModelStatus> modelStatuses) {
public record IrisStatusDTO(Map<String, ModelStatus> modelStatuses) {

Check warning on line 5 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisStatusDTO.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisStatusDTO.java#L5

Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=6E7611DD1919F2E6C4B89418ACB06DDC

public enum ModelStatus {

Check warning on line 7 in src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisStatusDTO.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/service/connectors/iris/dto/IrisStatusDTO.java#L7

Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=B9B4BF135C61E8F1D88D0BA957C1FE8E
UP, DOWN, NOT_AVAILABLE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import de.tum.in.www1.artemis.repository.CourseRepository;
import de.tum.in.www1.artemis.repository.ProgrammingExerciseRepository;
import de.tum.in.www1.artemis.repository.iris.IrisSettingsRepository;
import de.tum.in.www1.artemis.service.connectors.iris.IrisModel;
import de.tum.in.www1.artemis.web.rest.errors.AccessForbiddenException;
import de.tum.in.www1.artemis.web.rest.errors.BadRequestAlertException;

Expand Down Expand Up @@ -229,16 +228,13 @@ private IrisSubSettings combineSubSettings(IrisSubSettings subSettings1, IrisSub
combinedSettings.setEnabled(enabled);

if (!reduced) {
IrisModel preferredModel;
String preferredModel = null;
if (subSettings2 != null && subSettings2.getPreferredModel() != null) {
preferredModel = subSettings2.getPreferredModel();
}
else if (subSettings1 != null && subSettings1.getPreferredModel() != null) {
preferredModel = subSettings1.getPreferredModel();
}
else {
preferredModel = IrisModel.GPT35_TURBO;
}
combinedSettings.setPreferredModel(preferredModel);

IrisTemplate template;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package de.tum.in.www1.artemis.web.rest.iris;

import java.util.List;

import org.springframework.context.annotation.Profile;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import de.tum.in.www1.artemis.security.annotations.EnforceAtLeastEditor;
import de.tum.in.www1.artemis.service.connectors.iris.IrisConnectorException;
import de.tum.in.www1.artemis.service.connectors.iris.IrisConnectorService;
import de.tum.in.www1.artemis.service.connectors.iris.dto.IrisModelDTO;
import de.tum.in.www1.artemis.web.rest.errors.InternalServerErrorException;

/**
* REST controller for managing the models Pyris provides.
*/
@RestController
@Profile("iris")
@RequestMapping("api/")
public class IrisModelsResource {

private final IrisConnectorService irisConnectorService;

public IrisModelsResource(IrisConnectorService irisConnectorService) {

Check warning on line 27 in src/main/java/de/tum/in/www1/artemis/web/rest/iris/IrisModelsResource.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/web/rest/iris/IrisModelsResource.java#L27

[New] Interface comment missing https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=4434E21582FB50EA141F157074ABFD29
this.irisConnectorService = irisConnectorService;
}

/**
* GET iris/models: Retrieve all available models offered by Pyris
*
* @return the {@link ResponseEntity} with status {@code 200 (Ok)} and with body a List of the models
*/
@GetMapping("iris/models")
@EnforceAtLeastEditor
public ResponseEntity<List<IrisModelDTO>> getAllModels() {
try {
var models = irisConnectorService.getOfferedModels();
return ResponseEntity.ok(models);
}
catch (IrisConnectorException e) {
throw new InternalServerErrorException("Could not fetch available Iris models");

Check warning on line 44 in src/main/java/de/tum/in/www1/artemis/web/rest/iris/IrisModelsResource.java

View check run for this annotation

Teamscale / teamscale-findings

src/main/java/de/tum/in/www1/artemis/web/rest/iris/IrisModelsResource.java#L44

[New] Exception stacktrace is lost https://teamscale.io/findings.html#details/GitHub-ls1intum-Artemis?t=develop-iris%3AHEAD&id=C49AD1D152E98CB9370B3A5249578A78
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet id="20230717171717" author="morrien">
<modifyDataType tableName="iris_sub_settings" columnName="preferred_model" newDataType="VARCHAR(100)" />
</changeSet>
</databaseChangeLog>
1 change: 1 addition & 0 deletions src/main/resources/config/liquibase/master.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<include file="classpath:config/liquibase/changelog/20230626220000_changelog.xml" relativeToChangelogFile="false"/>
<include file="classpath:config/liquibase/changelog/20230629194400_changelog.xml" relativeToChangelogFile="false"/>
<include file="classpath:config/liquibase/changelog/20230714012100_changelog.xml" relativeToChangelogFile="false"/>
<include file="classpath:config/liquibase/changelog/20230717171717_changelog.xml" relativeToChangelogFile="false"/>
<!-- NOTE: please use the format "YYYYMMDDhhmmss_changelog.xml", i.e. year month day hour minutes seconds and not something else! -->
<!-- we should also stay in a chronological order! -->
<!-- you can use the command 'date '+%Y%m%d%H%M%S'' to get the current date and time in the correct format -->
Expand Down
5 changes: 5 additions & 0 deletions src/main/webapp/app/entities/iris/settings/iris-model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export class IrisModel {
id: string;
name: string;
description: string;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
import { BaseEntity } from 'app/shared/model/base-entity';
import { IrisTemplate } from 'app/entities/iris/settings/iris-template';

export enum IrisModel {
GPT35 = 'GPT35',
}

export class IrisSubSettings implements BaseEntity {
id?: number;
enabled = false;
template?: IrisTemplate;
preferredModel?: IrisModel;
preferredModel?: string;
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
<div>
<jhi-button id="reload" [btnType]="PRIMARY" [isLoading]="isLoading" [icon]="faRotate" [title]="'artemisApp.iris.settings.button.reload'" (onClick)="loadIrisSettings()">
</jhi-button>
<jhi-button id="save" [btnType]="SUCCESS" [isLoading]="isSaving" [icon]="faSave" [title]="'artemisApp.iris.settings.button.save'" (onClick)="saveIrisSettings()"> </jhi-button>
<jhi-button id="save" [btnType]="SUCCESS" [isLoading]="isSaving" [icon]="faSave" [title]="'artemisApp.iris.settings.button.save'" (onClick)="saveIrisSettings()"></jhi-button>
</div>
<div *ngIf="irisSettings">
<h3 jhiTranslate="artemisApp.iris.settings.subSettings.chatSettings">Chat Settings</h3>
<div>
<jhi-iris-sub-settings-update [subSettings]="irisSettings!.irisChatSettings!" [templateOptional]="settingType !== GLOBAL"></jhi-iris-sub-settings-update>
<jhi-iris-sub-settings-update
[subSettings]="irisSettings!.irisChatSettings!"
[models]="irisModels ?? []"
[templateOptional]="settingType !== GLOBAL"
[modelOptional]="settingType !== GLOBAL"
></jhi-iris-sub-settings-update>
</div>
<hr class="hr" />

<h3 jhiTranslate="artemisApp.iris.settings.subSettings.hestiaSettings">Hestia Settings</h3>
<div *ngIf="settingType === PROGRAMMING_EXERCISE" class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="inheritHestia" [checked]="!irisSettings?.irisHestiaSettings" (change)="onInheritHestiaSettingsChanged()" />
<label class="form-check-label" for="inheritHestia" jhiTranslate="artemisApp.iris.settings.subSettings.inheritHestiaSettings">Inherit</label>
<label class="form-check-label" for="inheritHestia" jhiTranslate="artemisApp.iris.settings.subSettings.inheritHestiaSettings"> Inherit </label>
</div>
<div *ngIf="irisSettings!.irisHestiaSettings">
<jhi-iris-sub-settings-update [subSettings]="irisSettings!.irisHestiaSettings!" [templateOptional]="settingType !== GLOBAL"></jhi-iris-sub-settings-update>
<jhi-iris-sub-settings-update
[subSettings]="irisSettings!.irisHestiaSettings!"
[models]="irisModels ?? []"
[templateOptional]="settingType !== GLOBAL"
[modelOptional]="settingType !== GLOBAL"
></jhi-iris-sub-settings-update>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { AlertService } from 'app/core/util/alert.service';
import { ButtonType } from 'app/shared/components/button.component';
import { faRotate, faSave } from '@fortawesome/free-solid-svg-icons';
import { IrisSubSettings } from 'app/entities/iris/settings/iris-sub-settings.model';
import { IrisModel } from 'app/entities/iris/settings/iris-model';

export enum IrisSettingsType {
GLOBAL = 'GLOBAL',
Expand All @@ -27,6 +28,7 @@ export class IrisSettingsUpdateComponent implements OnInit {
public programmingExerciseId?: number;

public irisSettings?: IrisSettings;
public irisModels?: IrisModel[];

// Loading bools
isLoading = false;
Expand All @@ -47,10 +49,17 @@ export class IrisSettingsUpdateComponent implements OnInit {
this.loadIrisSettings();
}

loadIrisModels(): void {
this.irisSettingsService.getIrisModels().subscribe((models) => {
this.irisModels = models;
this.isLoading = false;
});
}

loadIrisSettings(): void {
this.isLoading = true;
this.loadIrisSettingsObservable().subscribe((settings) => {
this.isLoading = false;
this.loadIrisModels();
if (!settings) {
this.alertService.error('artemisApp.iris.settings.error.noSettings');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,20 @@
<input class="form-check-input" type="checkbox" id="flexSwitchCheckDefault" [(ngModel)]="subSettings!.enabled" />
<label class="form-check-label" for="flexSwitchCheckDefault" jhiTranslate="artemisApp.iris.settings.subSettings.enabled-disabled"> Enabled/Disabled </label>
</div>
<span><span class="fw-bold" jhiTranslate="artemisApp.iris.settings.subSettings.preferredModel">Preferred Model</span>: {{ subSettings.preferredModel }}</span>
<span><span class="fw-bold" jhiTranslate="artemisApp.iris.settings.subSettings.preferredModel">Preferred Model</span>: </span>
<div *ngIf="true" ngbDropdown class="d-inline-block me-2">
<button class="btn btn-outline-primary w-100" id="dropdownBasic1" ngbDropdownToggle>
{{ getSelectedModelName() }}
</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button *ngIf="modelOptional" (click)="setModel(undefined)" [class.selected]="subSettings.preferredModel === undefined" ngbDropdownItem>
{{ 'artemisApp.iris.settings.subSettings.inheritModel' | artemisTranslate }}
</button>
<button *ngFor="let model of models" (click)="setModel(model)" [class.selected]="model.id === subSettings.preferredModel" [ngbTooltip]="model.description" ngbDropdownItem>
{{ model.name }}
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label fs-4 fw-bold" for="template-editor" jhiTranslate="artemisApp.iris.settings.subSettings.template.title"> Template </label>
<div *ngIf="templateOptional" class="form-check form-switch">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Component, Input } from '@angular/core';
import { IrisSubSettings } from 'app/entities/iris/settings/iris-sub-settings.model';
import { IrisTemplate } from 'app/entities/iris/settings/iris-template';
import { IrisModel } from 'app/entities/iris/settings/iris-model';

@Component({
selector: 'jhi-iris-sub-settings-update',
Expand All @@ -10,6 +11,12 @@ export class IrisSubSettingsUpdateComponent {
@Input()
subSettings: IrisSubSettings;

@Input()
models: IrisModel[];

@Input()
modelOptional = false;

@Input()
templateOptional = false;

Expand All @@ -25,4 +32,12 @@ export class IrisSubSettingsUpdateComponent {
this.subSettings.template = this.previousTemplate ?? irisTemplate;
}
}

getSelectedModelName(): string {
return this.models.find((model) => model.id === this.subSettings.preferredModel)?.name ?? this.subSettings.preferredModel ?? 'None';
}

setModel(model: IrisModel | undefined) {
this.subSettings.preferredModel = model?.id;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { HttpClient, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { IrisSettings } from 'app/entities/iris/settings/iris-settings.model';
import { IrisModel } from 'app/entities/iris/settings/iris-model';

type EntityResponseType = HttpResponse<IrisSettings>;

Expand Down Expand Up @@ -89,4 +90,11 @@ export class IrisSettingsService {
setProgrammingExerciseSettings(exerciseId: number, settings: IrisSettings): Observable<EntityResponseType> {
return this.http.put<IrisSettings>(`${this.resourceUrl}/programming-exercises/${exerciseId}/raw-iris-settings`, settings, { observe: 'response' });
}

/**
* Get the global Iris settings
*/
getIrisModels(): Observable<IrisModel[] | undefined> {
return this.http.get<IrisModel[]>(`${this.resourceUrl}/iris/models`, { observe: 'response' }).pipe(map((res: HttpResponse<IrisModel[]>) => res.body ?? []));
}
}
1 change: 1 addition & 0 deletions src/main/webapp/i18n/de/iris.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"inheritHestiaSettings": "Vererbe Hestia Einstellungen",
"enabled-disabled": "Aktiviert/Deaktiviert",
"preferredModel": "Präferiertes Modell",
"inheritModel": "Vererbe Modell",
"template": {
"title": "Template",
"inherit": "Inherit Template"
Expand Down
1 change: 1 addition & 0 deletions src/main/webapp/i18n/en/iris.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"inheritHestiaSettings": "Inherit Hestia Settings",
"enabled-disabled": "Enabled/Disabled",
"preferredModel": "Preferred Model",
"inheritModel": "Inherit Modell",
"template": {
"title": "Template",
"inherit": "Inherit Template"
Expand Down
Loading

0 comments on commit 04f1c2b

Please sign in to comment.