Skip to content

Commit 1958d65

Browse files
author
jabrock
committed
update to docker file and filtering of models in client
1 parent 6410904 commit 1958d65

File tree

3 files changed

+125
-85
lines changed

3 files changed

+125
-85
lines changed

app/Dockerfile

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
FROM nginx:1.23-alpine-slim
1+
FROM --platform=linux/amd64 node:18-slim AS builder
22

3-
RUN apk add --update nodejs npm
3+
WORKDIR /usr/src/app
4+
RUN mkdir -p ./src
5+
RUN mkdir -p ./scripts
6+
RUN mkdir -p ./staged-themes
47

5-
WORKDIR /usr/share/build
8+
COPY src/ ./src/
9+
COPY staged-themes/ ./staged-themes
10+
COPY scripts/ ./scripts/
11+
COPY *.json ./
612

7-
RUN mkdir -p /usr/share/build/src \
8-
&& mkdir -p /usr/share/build/scripts
9-
10-
COPY src/ /usr/share/build/src/
11-
12-
COPY scripts/ /usr/share/build/scripts/
13-
14-
COPY *.json /usr/share/build/
13+
RUN rm package-lock.json
1514

15+
RUN npm install -g @oracle/[email protected]
1616
RUN npm install
17-
RUN npm install -g @oracle/ojet-cli
18-
RUN ojet build web --release
17+
RUN ojet build web --release
1918

20-
RUN cp -R /usr/share/build/web/* /usr/share/nginx/html/
19+
FROM --platform=linux/amd64 nginx:1.23-alpine-slim
20+
RUN rm -rf /usr/share/nginx/html/*
21+
COPY --from=builder /usr/src/app/web/ /usr/share/nginx/html/
2122

2223
EXPOSE 80
2324

24-
CMD ["nginx", "-g", "daemon off;"]
25+
CMD ["nginx", "-g", "daemon off;"]

app/src/components/content/settings.tsx

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { ComponentProps } from "preact";
21
import { useEffect, useRef } from "preact/hooks";
32
import "oj-c/radioset";
43
import "oj-c/form-layout";
54
import "oj-c/select-single";
6-
import { CRadiosetElement } from "oj-c/radioset";
5+
import "ojs/ojlistitemlayout";
6+
import "ojs/ojhighlighttext";
77
import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider");
88

99
type ServiceTypeVal = "text" | "summary" | "sim";
@@ -60,7 +60,16 @@ export const Settings = (props: Props) => {
6060
throw new Error(`Response status: ${response.status}`);
6161
}
6262
const json = await response.json();
63-
modelDP.current.data = json;
63+
const result = json.filter((model: any) => {
64+
if (
65+
// model.capabilities.includes("FINE_TUNE") &&
66+
model.capabilities.includes("TEXT_GENERATION") &&
67+
model.vendor == "cohere" &&
68+
model.version > 15
69+
)
70+
return model;
71+
});
72+
modelDP.current.data = result;
6473
} catch (error: any) {
6574
console.log(
6675
"Java service not available for fetching list of Models: ",
@@ -72,6 +81,29 @@ export const Settings = (props: Props) => {
7281
useEffect(() => {
7382
fetchModels();
7483
}, []);
84+
85+
const modelTemplate = (item: any) => {
86+
return (
87+
<oj-list-item-layout class="oj-listitemlayout-padding-off">
88+
<span class="oj-typography-body-md oj-text-color-primary">
89+
<oj-highlight-text
90+
text={item.item.data.name}
91+
match-text={item.searchText}
92+
></oj-highlight-text>
93+
</span>
94+
<span
95+
slot="secondary"
96+
class="oj-typography-body-sm oj-text-color-secondary"
97+
>
98+
<oj-highlight-text
99+
text={JSON.stringify(item.item.data.capabilities)}
100+
match-text={item.searchText}
101+
></oj-highlight-text>
102+
</span>
103+
</oj-list-item-layout>
104+
);
105+
};
106+
75107
return (
76108
<div class="oj-sm-margin-4x">
77109
<h2 class="oj-typography-heading-sm">AI service types</h2>
@@ -103,7 +135,9 @@ export const Settings = (props: Props) => {
103135
labelHint={"Model"}
104136
itemText={"name"}
105137
onvalueChanged={props.modelIdChange}
106-
></oj-c-select-single>
138+
>
139+
<template slot="itemTemplate" render={modelTemplate}></template>
140+
</oj-c-select-single>
107141
</oj-c-form-layout>
108142
</>
109143
)}
Lines changed: 71 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package dev.victormartin.oci.genai.backend.backend.controller;
22

3-
import com.oracle.bmc.model.BmcException;
4-
import dev.victormartin.oci.genai.backend.backend.InvalidPromptRequest;
5-
import dev.victormartin.oci.genai.backend.backend.data.InteractionType;
6-
import dev.victormartin.oci.genai.backend.backend.service.OCIGenAIService;
7-
import dev.victormartin.oci.genai.backend.backend.dao.Answer;
8-
import dev.victormartin.oci.genai.backend.backend.dao.Prompt;
9-
import dev.victormartin.oci.genai.backend.backend.data.Interaction;
10-
import dev.victormartin.oci.genai.backend.backend.data.InteractionRepository;
3+
import java.util.Date;
4+
115
import org.slf4j.Logger;
126
import org.slf4j.LoggerFactory;
137
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,72 +12,83 @@
1812
import org.springframework.stereotype.Controller;
1913
import org.springframework.web.util.HtmlUtils;
2014

21-
import java.util.Date;
15+
import com.oracle.bmc.model.BmcException;
16+
17+
import dev.victormartin.oci.genai.backend.backend.InvalidPromptRequest;
18+
import dev.victormartin.oci.genai.backend.backend.dao.Answer;
19+
import dev.victormartin.oci.genai.backend.backend.dao.Prompt;
20+
import dev.victormartin.oci.genai.backend.backend.data.Interaction;
21+
import dev.victormartin.oci.genai.backend.backend.data.InteractionRepository;
22+
import dev.victormartin.oci.genai.backend.backend.data.InteractionType;
23+
import dev.victormartin.oci.genai.backend.backend.service.OCIGenAIService;
2224

2325
@Controller
2426
public class PromptController {
25-
Logger logger = LoggerFactory.getLogger(PromptController.class);
2627

27-
@Value("${genai.chat_model_id}")
28-
private String hardcodedChatModelId;
28+
Logger logger = LoggerFactory.getLogger(PromptController.class);
29+
30+
@Value("${genai.chat_model_id}")
31+
private String hardcodedChatModelId;
2932

30-
@Autowired
31-
private final InteractionRepository interactionRepository;
33+
@Autowired
34+
private final InteractionRepository interactionRepository;
3235

33-
@Autowired
36+
@Autowired
3437
OCIGenAIService genAI;
3538

36-
public PromptController(InteractionRepository interactionRepository, OCIGenAIService genAI) {
37-
this.interactionRepository = interactionRepository;
38-
this.genAI = genAI;
39-
}
39+
public PromptController(InteractionRepository interactionRepository, OCIGenAIService genAI) {
40+
this.interactionRepository = interactionRepository;
41+
this.genAI = genAI;
42+
}
43+
44+
@MessageMapping("/prompt")
45+
@SendToUser("/queue/answer")
46+
public Answer handlePrompt(Prompt prompt) {
47+
String promptEscaped = HtmlUtils.htmlEscape(prompt.content());
48+
String activeModel = (prompt.modelId() == null) ? hardcodedChatModelId : prompt.modelId();
49+
logger.info("Prompt " + promptEscaped + " received, on model " + activeModel);
50+
51+
Interaction interaction = new Interaction();
52+
interaction.setType(InteractionType.CHAT);
53+
interaction.setConversationId(prompt.conversationId());
54+
interaction.setDatetimeRequest(new Date());
55+
interaction.setModelId(activeModel);
56+
interaction.setRequest(promptEscaped);
57+
Interaction saved = interactionRepository.save(interaction);
58+
try {
59+
if (prompt.content().isEmpty()) {
60+
throw new InvalidPromptRequest();
61+
}
62+
// if (prompt.modelId() == null ||
63+
// !prompt.modelId().startsWith("ocid1.generativeaimodel.")) { throw new
64+
// InvalidPromptRequest(); }
65+
saved.setDatetimeResponse(new Date());
66+
String responseFromGenAI = genAI.resolvePrompt(promptEscaped, activeModel);
67+
saved.setResponse(responseFromGenAI);
68+
interactionRepository.save(saved);
69+
return new Answer(responseFromGenAI, "");
4070

41-
@MessageMapping("/prompt")
42-
@SendToUser("/queue/answer")
43-
public Answer handlePrompt(Prompt prompt) {
44-
String promptEscaped = HtmlUtils.htmlEscape(prompt.content());
45-
logger.info("Prompt " + promptEscaped + " received, on model " + prompt.modelId() + " but using hardcoded one" +
46-
" " + hardcodedChatModelId);
47-
Interaction interaction = new Interaction();
48-
interaction.setType(InteractionType.CHAT);
49-
interaction.setConversationId(prompt.conversationId());
50-
interaction.setDatetimeRequest(new Date());
51-
interaction.setModelId(hardcodedChatModelId);
52-
interaction.setRequest(promptEscaped);
53-
Interaction saved = interactionRepository.save(interaction);
54-
try {
55-
if (prompt.content().isEmpty()) {
56-
throw new InvalidPromptRequest();
57-
}
58-
// if (prompt.modelId() == null ||
59-
// !prompt.modelId().startsWith("ocid1.generativeaimodel.")) { throw new
60-
// InvalidPromptRequest(); }
61-
String responseFromGenAI = genAI.resolvePrompt(promptEscaped, hardcodedChatModelId);
62-
saved.setDatetimeResponse(new Date());
63-
saved.setResponse(responseFromGenAI);
64-
interactionRepository.save(saved);
65-
return new Answer(responseFromGenAI, "");
66-
} catch (BmcException exception) {
67-
logger.error("Message: {}", exception.getMessage());
68-
logger.error("Original Message: {}", exception.getOriginalMessage());
69-
logger.error("Unmodified Message: {}", exception.getUnmodifiedMessage());
70-
logger.error("Service Details: {}", exception.getServiceDetails());
71-
logger.error("Status Code: {}", exception.getStatusCode());
72-
String unmodifiedMessage = exception.getUnmodifiedMessage();
73-
int statusCode = exception.getStatusCode();
74-
String errorMessage = statusCode + " " + unmodifiedMessage;
75-
logger.error(errorMessage);
76-
saved.setErrorMessage(errorMessage);
77-
interactionRepository.save(saved);
78-
return new Answer("", errorMessage);
79-
} catch (InvalidPromptRequest exception) {
80-
int statusCode = HttpStatus.BAD_REQUEST.value();
81-
String errorMessage = statusCode + " Invalid Prompt ";
82-
logger.error(errorMessage);
83-
saved.setErrorMessage(errorMessage);
84-
interactionRepository.save(saved);
85-
return new Answer("", errorMessage);
86-
}
87-
}
71+
} catch (BmcException exception) {
72+
logger.error("Message: {}", exception.getMessage());
73+
logger.error("Original Message: {}", exception.getOriginalMessage());
74+
logger.error("Unmodified Message: {}", exception.getUnmodifiedMessage());
75+
logger.error("Service Details: {}", exception.getServiceDetails());
76+
logger.error("Status Code: {}", exception.getStatusCode());
77+
String unmodifiedMessage = exception.getUnmodifiedMessage();
78+
int statusCode = exception.getStatusCode();
79+
String errorMessage = statusCode + " " + unmodifiedMessage;
80+
logger.error(errorMessage);
81+
saved.setErrorMessage(errorMessage);
82+
interactionRepository.save(saved);
83+
return new Answer("", errorMessage);
84+
} catch (InvalidPromptRequest exception) {
85+
int statusCode = HttpStatus.BAD_REQUEST.value();
86+
String errorMessage = statusCode + " Invalid Prompt ";
87+
logger.error(errorMessage);
88+
saved.setErrorMessage(errorMessage);
89+
interactionRepository.save(saved);
90+
return new Answer("", errorMessage);
91+
}
92+
}
8893

8994
}

0 commit comments

Comments
 (0)