Skip to content

Commit ef53870

Browse files
authored
Merge pull request #36 from oracle-devrel/new-chat-api
New chat api
2 parents 5214d11 + 5c4d52d commit ef53870

File tree

12 files changed

+1336
-1292
lines changed

12 files changed

+1336
-1292
lines changed

app/src/components/content/summary.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const hostname =
3636
? "localhost:8080"
3737
: window.location.hostname;
3838
const serviceRootURL = `${protocol}${hostname}`;
39-
const acceptArr: string[] = ["application/pdf", "*.pdf"];
39+
const acceptArr: string[] = ["application/pdf", "*.pdf", "text/plain", "*.txt"];
4040
const messages: { id: number; severity: string; summary: string }[] = [];
4141
const FILE_SIZE = 120000;
4242

@@ -271,7 +271,7 @@ export const Summary = ({
271271
<div class="oj-flex-item oj-sm-margin-4x">
272272
<h1>Document Summarization</h1>
273273
<div class="oj-typography-body-md oj-sm-padding-1x-bottom">
274-
Upload a PDF file
274+
Upload a PDF/TXT file
275275
</div>
276276
<oj-validation-group ref={valGroupRef}>
277277
<oj-c-file-picker
@@ -283,7 +283,7 @@ export const Summary = ({
283283
onojBeforeSelect={beforeSelectListener}
284284
secondaryText={`Maximum file size is ${
285285
FILE_SIZE / 1000
286-
}KB per PDF file.`}
286+
}KB per PDF or TXT file.`}
287287
></oj-c-file-picker>
288288
{backendType === "python" && (
289289
<oj-c-input-text

backend/build.gradle

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,18 @@ dependencies {
2020
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
2121
implementation 'org.springframework.boot:spring-boot-starter-websocket'
2222
implementation 'org.springframework.boot:spring-boot-starter-actuator'
23-
implementation 'com.oracle.oci.sdk:oci-java-sdk-shaded-full:3.33.0'
24-
implementation 'com.oracle.oci.sdk:oci-java-sdk-core:3.35.0'
25-
implementation 'com.oracle.oci.sdk:oci-java-sdk-common:3.35.0'
26-
implementation 'com.oracle.oci.sdk:oci-java-sdk-addons-oke-workload-identity:3.35.0'
27-
implementation 'com.oracle.oci.sdk:oci-java-sdk-generativeai:3.35.0'
23+
implementation 'org.netbeans.external:org-apache-commons-io:RELEASE113'
24+
implementation 'com.oracle.oci.sdk:oci-java-sdk-shaded-full:3.52.1'
25+
implementation 'com.oracle.oci.sdk:oci-java-sdk-core:3.52.1'
26+
implementation 'com.oracle.oci.sdk:oci-java-sdk-common:3.52.1'
27+
implementation 'com.oracle.oci.sdk:oci-java-sdk-addons-oke-workload-identity:3.52.1'
28+
implementation 'com.oracle.oci.sdk:oci-java-sdk-generativeai:3.52.1'
2829
implementation 'com.oracle.database.jdbc:ojdbc11-production:21.8.0.0'
2930
implementation 'com.oracle.database.jdbc:ucp:21.8.0.0'
3031
implementation 'com.oracle.database.security:oraclepki:21.8.0.0'
3132
implementation 'com.oracle.database.security:osdt_cert:21.8.0.0'
3233
implementation 'com.oracle.database.security:osdt_core:21.8.0.0'
33-
implementation 'org.apache.pdfbox:pdfbox:3.0.2' exclude(group: 'commons-logging', module: 'commons-logging')
34+
implementation 'org.apache.pdfbox:pdfbox:3.0.3' exclude(group: 'commons-logging', module: 'commons-logging')
3435
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3536
}
3637

backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/GenAIController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
import com.oracle.bmc.generativeai.requests.ListEndpointsRequest;
77
import com.oracle.bmc.generativeai.responses.ListModelsResponse;
88
import com.oracle.bmc.generativeai.responses.ListEndpointsResponse;
9-
import com.oracle.bmc.generativeai.model.EndpointSummary;
109
import dev.victormartin.oci.genai.backend.backend.dao.GenAiModel;
1110
import dev.victormartin.oci.genai.backend.backend.dao.GenAiEndpoint;
12-
import dev.victormartin.oci.genai.backend.backend.service.GenerativeAiClientService;
11+
import dev.victormartin.oci.genai.backend.backend.service.GenAiClientService;
1312
import org.slf4j.Logger;
1413
import org.slf4j.LoggerFactory;
1514
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +27,7 @@ public class GenAIController {
2827
private String COMPARTMENT_ID;
2928

3029
@Autowired
31-
private GenerativeAiClientService generativeAiClientService;
30+
private GenAiClientService generativeAiClientService;
3231

3332
@GetMapping("/api/genai/models")
3433
public List<GenAiModel> getModels() {

backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/PDFConvertorController.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import dev.victormartin.oci.genai.backend.backend.data.InteractionType;
99
import dev.victormartin.oci.genai.backend.backend.service.OCIGenAIService;
1010
import dev.victormartin.oci.genai.backend.backend.service.PDFConvertorService;
11+
import org.apache.commons.io.FileUtils;
1112
import org.slf4j.Logger;
1213
import org.slf4j.LoggerFactory;
1314
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +23,8 @@
2223
import org.springframework.web.util.HtmlUtils;
2324

2425
import java.io.File;
26+
import java.nio.charset.Charset;
27+
import java.nio.charset.StandardCharsets;
2528
import java.util.Date;
2629

2730
@RestController
@@ -49,6 +52,7 @@ public Answer fileUploading(@RequestParam("file") MultipartFile multipartFile,
4952
@RequestHeader("modelId") String modelId) {
5053
String filename = StringUtils.cleanPath(multipartFile.getOriginalFilename());
5154
log.info("File uploaded {} {} bytes ({})", filename, multipartFile.getSize(), multipartFile.getContentType());
55+
String contentType = multipartFile.getContentType();// application/pdf
5256
try {
5357
if (filename.contains("..")) {
5458
throw new Exception("Filename contains invalid path sequence");
@@ -60,7 +64,18 @@ public Answer fileUploading(@RequestParam("file") MultipartFile multipartFile,
6064
File file = new File(fileDestinationPath + File.separator + filename);
6165
multipartFile.transferTo(file);
6266
log.info("File destination path: {}", file.getAbsolutePath());
63-
String convertedText = pdfConvertorService.convert(file.getAbsolutePath());
67+
String convertedText;
68+
switch (contentType) {
69+
case "text/plain":
70+
convertedText = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
71+
break;
72+
case "application/pdf":
73+
convertedText = pdfConvertorService.convert(file.getAbsolutePath());
74+
break;
75+
default:
76+
convertedText= "";
77+
break;
78+
}
6479
String textEscaped = HtmlUtils.htmlEscape(convertedText);
6580
Interaction interaction = new Interaction();
6681
interaction.setType(InteractionType.SUMMARY_FILE);
@@ -69,7 +84,7 @@ public Answer fileUploading(@RequestParam("file") MultipartFile multipartFile,
6984
interaction.setModelId(summarizationModelId);
7085
interaction.setRequest(textEscaped);
7186
Interaction saved = interactionRepository.save(interaction);
72-
String summaryText = ociGenAIService.summaryText(textEscaped, summarizationModelId);
87+
String summaryText = ociGenAIService.summaryText(textEscaped, summarizationModelId, false);
7388
saved.setDatetimeResponse(new Date());
7489
saved.setResponse(summaryText);
7590
interactionRepository.save(saved);

backend/src/main/java/dev/victormartin/oci/genai/backend/backend/controller/SummaryController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public Answer postSummaryText(@RequestBody SummaryRequest summaryRequest,
4747
interaction.setRequest(contentEscaped);
4848
Interaction saved = interactionRepository.save(interaction);
4949
try {
50-
String summaryText = ociGenAIService.summaryText(contentEscaped, summarizationModelId);
50+
String summaryText = ociGenAIService.summaryText(contentEscaped, summarizationModelId, false);
5151
saved.setDatetimeResponse(new Date());
5252
saved.setResponse(summaryText);
5353
interactionRepository.save(saved);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
import java.io.IOException;
1919

2020
@Service
21-
public class GenerativeAiClientService {
21+
public class GenAiClientService {
2222

23-
Logger log = LoggerFactory.getLogger(GenerativeAiClientService.class);
23+
Logger log = LoggerFactory.getLogger(GenAiClientService.class);
2424

2525
@Autowired
2626
private Environment environment;
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
77
import com.oracle.bmc.auth.InstancePrincipalsAuthenticationDetailsProvider;
88
import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider;
9-
import com.oracle.bmc.generativeai.GenerativeAiClient;
109
import com.oracle.bmc.generativeaiinference.GenerativeAiInferenceClient;
1110
import jakarta.annotation.PostConstruct;
1211
import org.slf4j.Logger;
@@ -19,9 +18,9 @@
1918
import java.io.IOException;
2019

2120
@Service
22-
public class GenerativeAiInferenceClientService {
21+
public class GenAiInferenceClientService {
2322

24-
Logger log = LoggerFactory.getLogger(GenerativeAiInferenceClientService.class);
23+
Logger log = LoggerFactory.getLogger(GenAiInferenceClientService.class);
2524

2625
private GenerativeAiInferenceClient client;
2726

backend/src/main/java/dev/victormartin/oci/genai/backend/backend/service/OCIGenAIService.java

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,21 @@
22

33
import com.oracle.bmc.generativeaiinference.GenerativeAiInferenceClient;
44
import com.oracle.bmc.generativeaiinference.model.*;
5+
import com.oracle.bmc.generativeaiinference.requests.ChatRequest;
56
import com.oracle.bmc.generativeaiinference.requests.GenerateTextRequest;
67
import com.oracle.bmc.generativeaiinference.requests.SummarizeTextRequest;
8+
import com.oracle.bmc.generativeaiinference.responses.ChatResponse;
79
import com.oracle.bmc.generativeaiinference.responses.GenerateTextResponse;
810
import com.oracle.bmc.generativeaiinference.responses.SummarizeTextResponse;
11+
import com.oracle.bmc.http.client.jersey.WrappedResponseInputStream;
12+
import org.hibernate.boot.archive.scan.internal.StandardScanner;
913
import org.springframework.beans.factory.annotation.Autowired;
1014
import org.springframework.beans.factory.annotation.Value;
1115
import org.springframework.stereotype.Service;
1216

17+
import java.io.*;
18+
import java.nio.charset.StandardCharsets;
19+
import java.util.List;
1320
import java.util.stream.Collectors;
1421

1522
@Service
@@ -18,52 +25,47 @@ public class OCIGenAIService {
1825
private String COMPARTMENT_ID;
1926

2027
@Autowired
21-
private GenerativeAiInferenceClientService generativeAiInferenceClientService;
28+
private GenAiInferenceClientService generativeAiInferenceClientService;
2229

2330
public String resolvePrompt(String input, String modelId, boolean finetune) {
24-
// Build generate text request, send, and get response
25-
CohereLlmInferenceRequest llmInferenceRequest = CohereLlmInferenceRequest.builder()
26-
.prompt(input)
27-
.maxTokens(600)
28-
.temperature((double) 1)
29-
.frequencyPenalty((double) 0)
30-
.topP((double) 0.75)
31-
.isStream(false)
32-
.isEcho(false)
33-
.build();
31+
CohereChatRequest cohereChatRequest = CohereChatRequest.builder()
32+
.message(input)
33+
.maxTokens(600)
34+
.temperature((double) 1)
35+
.frequencyPenalty((double) 0)
36+
.topP((double) 0.75)
37+
.topK(0)
38+
.isStream(false) // TODO websockets and streams
39+
.build();
3440

35-
GenerateTextDetails generateTextDetails = GenerateTextDetails.builder()
36-
.servingMode(finetune ? DedicatedServingMode.builder().endpointId(modelId).build()
37-
: OnDemandServingMode.builder().modelId(modelId).build())
38-
.compartmentId(COMPARTMENT_ID)
39-
.inferenceRequest(llmInferenceRequest)
40-
.build();
41-
GenerateTextRequest generateTextRequest = GenerateTextRequest.builder()
42-
.generateTextDetails(generateTextDetails)
43-
.build();
44-
GenerativeAiInferenceClient client = generativeAiInferenceClientService.getClient();
45-
GenerateTextResponse generateTextResponse = client.generateText(generateTextRequest);
46-
CohereLlmInferenceResponse response = (CohereLlmInferenceResponse) generateTextResponse
47-
.getGenerateTextResult().getInferenceResponse();
48-
String responseTexts = response.getGeneratedTexts()
49-
.stream()
50-
.map(t -> t.getText())
51-
.collect(Collectors.joining(","));
52-
return responseTexts;
41+
ChatDetails chatDetails = ChatDetails.builder()
42+
.servingMode(OnDemandServingMode.builder().modelId(modelId).build())
43+
.compartmentId(COMPARTMENT_ID)
44+
.chatRequest(cohereChatRequest)
45+
.build();
46+
47+
ChatRequest request = ChatRequest.builder()
48+
.chatDetails(chatDetails)
49+
.build();
50+
ChatResponse response = generativeAiInferenceClientService.getClient().chat(request);
51+
ChatResult chatResult = response.getChatResult();
52+
53+
BaseChatResponse baseChatResponse = chatResult.getChatResponse();
54+
if (baseChatResponse instanceof CohereChatResponse) {
55+
return ((CohereChatResponse)baseChatResponse).getText();
56+
} else if (baseChatResponse instanceof GenericChatResponse) {
57+
List<ChatChoice> choices = ((GenericChatResponse) baseChatResponse).getChoices();
58+
List<ChatContent> contents = choices.get(choices.size() - 1).getMessage().getContent();
59+
ChatContent content = contents.get(contents.size() - 1);
60+
if (content instanceof TextContent) {
61+
return ((TextContent) content).getText();
62+
}
63+
}
64+
throw new IllegalStateException("Unexpected chat response type: " + baseChatResponse.getClass().getName());
5365
}
5466

55-
public String summaryText(String input, String modelId) {
56-
SummarizeTextDetails summarizeTextDetails = SummarizeTextDetails.builder()
57-
.servingMode(OnDemandServingMode.builder().modelId(modelId).build())
58-
.compartmentId(COMPARTMENT_ID)
59-
.input(input)
60-
.build();
61-
SummarizeTextRequest request = SummarizeTextRequest.builder()
62-
.summarizeTextDetails(summarizeTextDetails)
63-
.build();
64-
GenerativeAiInferenceClient client = generativeAiInferenceClientService.getClient();
65-
SummarizeTextResponse summarizeTextResponse = client.summarizeText(request);
66-
String summaryText = summarizeTextResponse.getSummarizeTextResult().getSummary();
67-
return summaryText;
67+
public String summaryText(String input, String modelId, boolean finetuned) {
68+
String response = resolvePrompt("Summarize this:\n" + input, modelId, finetuned);
69+
return response;
6870
}
6971
}

0 commit comments

Comments
 (0)