From 1958d651efa8df3a7db25d07ab09ef369b561f5d Mon Sep 17 00:00:00 2001 From: jabrock Date: Wed, 28 Aug 2024 12:58:41 -0700 Subject: [PATCH] update to docker file and filtering of models in client --- app/Dockerfile | 31 ++-- app/src/components/content/settings.tsx | 42 +++++- .../backend/controller/PromptController.java | 137 +++++++++--------- 3 files changed, 125 insertions(+), 85 deletions(-) diff --git a/app/Dockerfile b/app/Dockerfile index 09c06581..d593f433 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,24 +1,25 @@ -FROM nginx:1.23-alpine-slim +FROM --platform=linux/amd64 node:18-slim AS builder -RUN apk add --update nodejs npm +WORKDIR /usr/src/app +RUN mkdir -p ./src +RUN mkdir -p ./scripts +RUN mkdir -p ./staged-themes -WORKDIR /usr/share/build +COPY src/ ./src/ +COPY staged-themes/ ./staged-themes +COPY scripts/ ./scripts/ +COPY *.json ./ -RUN mkdir -p /usr/share/build/src \ - && mkdir -p /usr/share/build/scripts - -COPY src/ /usr/share/build/src/ - -COPY scripts/ /usr/share/build/scripts/ - -COPY *.json /usr/share/build/ +RUN rm package-lock.json +RUN npm install -g @oracle/ojet-cli@16.1.0 RUN npm install -RUN npm install -g @oracle/ojet-cli -RUN ojet build web --release +RUN ojet build web --release -RUN cp -R /usr/share/build/web/* /usr/share/nginx/html/ +FROM --platform=linux/amd64 nginx:1.23-alpine-slim +RUN rm -rf /usr/share/nginx/html/* +COPY --from=builder /usr/src/app/web/ /usr/share/nginx/html/ EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +CMD ["nginx", "-g", "daemon off;"] diff --git a/app/src/components/content/settings.tsx b/app/src/components/content/settings.tsx index 3863b301..34bef53c 100644 --- a/app/src/components/content/settings.tsx +++ b/app/src/components/content/settings.tsx @@ -1,9 +1,9 @@ -import { ComponentProps } from "preact"; import { useEffect, useRef } from "preact/hooks"; import "oj-c/radioset"; import "oj-c/form-layout"; import "oj-c/select-single"; -import { CRadiosetElement } from "oj-c/radioset"; +import "ojs/ojlistitemlayout"; +import "ojs/ojhighlighttext"; import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); type ServiceTypeVal = "text" | "summary" | "sim"; @@ -60,7 +60,16 @@ export const Settings = (props: Props) => { throw new Error(`Response status: ${response.status}`); } const json = await response.json(); - modelDP.current.data = json; + const result = json.filter((model: any) => { + if ( + // model.capabilities.includes("FINE_TUNE") && + model.capabilities.includes("TEXT_GENERATION") && + model.vendor == "cohere" && + model.version > 15 + ) + return model; + }); + modelDP.current.data = result; } catch (error: any) { console.log( "Java service not available for fetching list of Models: ", @@ -72,6 +81,29 @@ export const Settings = (props: Props) => { useEffect(() => { fetchModels(); }, []); + + const modelTemplate = (item: any) => { + return ( + + + + + + + + + ); + }; + return (

AI service types

@@ -103,7 +135,9 @@ export const Settings = (props: Props) => { labelHint={"Model"} itemText={"name"} onvalueChanged={props.modelIdChange} - > + > + + )} diff --git a/backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/PromptController.java b/backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/PromptController.java index 94d2ecfe..7fc05eba 100644 --- a/backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/PromptController.java +++ b/backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/PromptController.java @@ -1,13 +1,7 @@ package dev.victormartin.oci.genai.backend.backend.controller; -import com.oracle.bmc.model.BmcException; -import dev.victormartin.oci.genai.backend.backend.InvalidPromptRequest; -import dev.victormartin.oci.genai.backend.backend.data.InteractionType; -import dev.victormartin.oci.genai.backend.backend.service.OCIGenAIService; -import dev.victormartin.oci.genai.backend.backend.dao.Answer; -import dev.victormartin.oci.genai.backend.backend.dao.Prompt; -import dev.victormartin.oci.genai.backend.backend.data.Interaction; -import dev.victormartin.oci.genai.backend.backend.data.InteractionRepository; +import java.util.Date; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,72 +12,83 @@ import org.springframework.stereotype.Controller; import org.springframework.web.util.HtmlUtils; -import java.util.Date; +import com.oracle.bmc.model.BmcException; + +import dev.victormartin.oci.genai.backend.backend.InvalidPromptRequest; +import dev.victormartin.oci.genai.backend.backend.dao.Answer; +import dev.victormartin.oci.genai.backend.backend.dao.Prompt; +import dev.victormartin.oci.genai.backend.backend.data.Interaction; +import dev.victormartin.oci.genai.backend.backend.data.InteractionRepository; +import dev.victormartin.oci.genai.backend.backend.data.InteractionType; +import dev.victormartin.oci.genai.backend.backend.service.OCIGenAIService; @Controller public class PromptController { - Logger logger = LoggerFactory.getLogger(PromptController.class); - @Value("${genai.chat_model_id}") - private String hardcodedChatModelId; + Logger logger = LoggerFactory.getLogger(PromptController.class); + + @Value("${genai.chat_model_id}") + private String hardcodedChatModelId; - @Autowired - private final InteractionRepository interactionRepository; + @Autowired + private final InteractionRepository interactionRepository; - @Autowired + @Autowired OCIGenAIService genAI; - public PromptController(InteractionRepository interactionRepository, OCIGenAIService genAI) { - this.interactionRepository = interactionRepository; - this.genAI = genAI; - } + public PromptController(InteractionRepository interactionRepository, OCIGenAIService genAI) { + this.interactionRepository = interactionRepository; + this.genAI = genAI; + } + + @MessageMapping("/prompt") + @SendToUser("/queue/answer") + public Answer handlePrompt(Prompt prompt) { + String promptEscaped = HtmlUtils.htmlEscape(prompt.content()); + String activeModel = (prompt.modelId() == null) ? hardcodedChatModelId : prompt.modelId(); + logger.info("Prompt " + promptEscaped + " received, on model " + activeModel); + + Interaction interaction = new Interaction(); + interaction.setType(InteractionType.CHAT); + interaction.setConversationId(prompt.conversationId()); + interaction.setDatetimeRequest(new Date()); + interaction.setModelId(activeModel); + interaction.setRequest(promptEscaped); + Interaction saved = interactionRepository.save(interaction); + try { + if (prompt.content().isEmpty()) { + throw new InvalidPromptRequest(); + } + // if (prompt.modelId() == null || + // !prompt.modelId().startsWith("ocid1.generativeaimodel.")) { throw new + // InvalidPromptRequest(); } + saved.setDatetimeResponse(new Date()); + String responseFromGenAI = genAI.resolvePrompt(promptEscaped, activeModel); + saved.setResponse(responseFromGenAI); + interactionRepository.save(saved); + return new Answer(responseFromGenAI, ""); - @MessageMapping("/prompt") - @SendToUser("/queue/answer") - public Answer handlePrompt(Prompt prompt) { - String promptEscaped = HtmlUtils.htmlEscape(prompt.content()); - logger.info("Prompt " + promptEscaped + " received, on model " + prompt.modelId() + " but using hardcoded one" + - " " + hardcodedChatModelId); - Interaction interaction = new Interaction(); - interaction.setType(InteractionType.CHAT); - interaction.setConversationId(prompt.conversationId()); - interaction.setDatetimeRequest(new Date()); - interaction.setModelId(hardcodedChatModelId); - interaction.setRequest(promptEscaped); - Interaction saved = interactionRepository.save(interaction); - try { - if (prompt.content().isEmpty()) { - throw new InvalidPromptRequest(); - } - // if (prompt.modelId() == null || - // !prompt.modelId().startsWith("ocid1.generativeaimodel.")) { throw new - // InvalidPromptRequest(); } - String responseFromGenAI = genAI.resolvePrompt(promptEscaped, hardcodedChatModelId); - saved.setDatetimeResponse(new Date()); - saved.setResponse(responseFromGenAI); - interactionRepository.save(saved); - return new Answer(responseFromGenAI, ""); - } catch (BmcException exception) { - logger.error("Message: {}", exception.getMessage()); - logger.error("Original Message: {}", exception.getOriginalMessage()); - logger.error("Unmodified Message: {}", exception.getUnmodifiedMessage()); - logger.error("Service Details: {}", exception.getServiceDetails()); - logger.error("Status Code: {}", exception.getStatusCode()); - String unmodifiedMessage = exception.getUnmodifiedMessage(); - int statusCode = exception.getStatusCode(); - String errorMessage = statusCode + " " + unmodifiedMessage; - logger.error(errorMessage); - saved.setErrorMessage(errorMessage); - interactionRepository.save(saved); - return new Answer("", errorMessage); - } catch (InvalidPromptRequest exception) { - int statusCode = HttpStatus.BAD_REQUEST.value(); - String errorMessage = statusCode + " Invalid Prompt "; - logger.error(errorMessage); - saved.setErrorMessage(errorMessage); - interactionRepository.save(saved); - return new Answer("", errorMessage); - } - } + } catch (BmcException exception) { + logger.error("Message: {}", exception.getMessage()); + logger.error("Original Message: {}", exception.getOriginalMessage()); + logger.error("Unmodified Message: {}", exception.getUnmodifiedMessage()); + logger.error("Service Details: {}", exception.getServiceDetails()); + logger.error("Status Code: {}", exception.getStatusCode()); + String unmodifiedMessage = exception.getUnmodifiedMessage(); + int statusCode = exception.getStatusCode(); + String errorMessage = statusCode + " " + unmodifiedMessage; + logger.error(errorMessage); + saved.setErrorMessage(errorMessage); + interactionRepository.save(saved); + return new Answer("", errorMessage); + } catch (InvalidPromptRequest exception) { + int statusCode = HttpStatus.BAD_REQUEST.value(); + String errorMessage = statusCode + " Invalid Prompt "; + logger.error(errorMessage); + saved.setErrorMessage(errorMessage); + interactionRepository.save(saved); + return new Answer("", errorMessage); + } + } }