Skip to content

Commit 9980da4

Browse files
committed
init
1 parent 07efa96 commit 9980da4

8 files changed

+106
-37
lines changed

sql/aiuser-tables-indexes-functions.sql

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,75 @@ dbms_cloud.create_credential (
5050
);
5151
END;
5252

53-
CREATE OR REPLACE FUNCTION call_analyze_image_api_objectstore (
53+
--The following two functions (text and object detection) are indentical
54+
--except for the json_table parsing for the textfromai field,
55+
--and so technically the p_featureType is not necessary and the function could be made to handle/parse both types,
56+
--however, for readability they are broken into two distinct functions
57+
58+
59+
CREATE OR REPLACE FUNCTION VISIONAI_TEXTDETECTION (
60+
p_endpoint VARCHAR2,
61+
p_compartment_ocid VARCHAR2,
62+
p_namespaceName VARCHAR2,
63+
p_bucketName VARCHAR2,
64+
p_objectName VARCHAR2,
65+
p_featureType VARCHAR2,
66+
p_label VARCHAR2
67+
) RETURN VARCHAR2 IS
68+
resp DBMS_CLOUD_TYPES.resp;
69+
json_response CLOB;
70+
v_textfromai VARCHAR2(32767);
71+
BEGIN
72+
resp := DBMS_CLOUD.send_request(
73+
credential_name => 'OCI_KEY_CRED',
74+
uri => p_endpoint || '/20220125/actions/analyzeImage',
75+
method => 'POST',
76+
body => UTL_RAW.cast_to_raw(
77+
JSON_OBJECT(
78+
'features' VALUE JSON_ARRAY(
79+
JSON_OBJECT('featureType' VALUE p_featureType)
80+
),
81+
'image' VALUE JSON_OBJECT(
82+
'source' VALUE 'OBJECT_STORAGE',
83+
'namespaceName' VALUE p_namespaceName,
84+
'bucketName' VALUE p_bucketName,
85+
'objectName' VALUE p_objectName
86+
),
87+
'compartmentId' VALUE p_compartment_ocid
88+
)
89+
)
90+
);
91+
json_response := DBMS_CLOUD.get_response_text(resp);
92+
SELECT LISTAGG(text, ', ') WITHIN GROUP (ORDER BY ROWNUM)
93+
INTO v_textfromai
94+
FROM JSON_TABLE(json_response, '$.imageText.words[*]'
95+
COLUMNS (
96+
text VARCHAR2(100) PATH '$.text'
97+
)
98+
);
99+
INSERT INTO aivision_results (id, date_loaded, label, textfromai, jsondata)
100+
VALUES (SYS_GUID(), SYSTIMESTAMP, p_label, v_textfromai, json_response);
101+
RETURN v_textfromai;
102+
EXCEPTION
103+
WHEN OTHERS THEN
104+
RAISE;
105+
END VISIONAI_TEXTDETECTION;
106+
/
107+
108+
BEGIN
109+
ORDS.ENABLE_OBJECT(
110+
P_ENABLED => TRUE,
111+
P_SCHEMA => 'AIUSER',
112+
P_OBJECT => 'VISIONAI_TEXTDETECTION',
113+
P_OBJECT_TYPE => 'FUNCTION',
114+
P_OBJECT_ALIAS => 'VISIONAI_TEXTDETECTION',
115+
P_AUTO_REST_AUTH => FALSE
116+
);
117+
COMMIT;
118+
END;
119+
/
120+
121+
CREATE OR REPLACE FUNCTION VISIONAI_OBJECTDETECTION (
54122
p_endpoint VARCHAR2,
55123
p_compartment_ocid VARCHAR2,
56124
p_namespaceName VARCHAR2,
@@ -96,16 +164,16 @@ BEGIN
96164
EXCEPTION
97165
WHEN OTHERS THEN
98166
RAISE;
99-
END call_analyze_image_api_objectstore;
167+
END VISIONAI_OBJECTDETECTION;
100168
/
101169

102170
BEGIN
103171
ORDS.ENABLE_OBJECT(
104172
P_ENABLED => TRUE,
105173
P_SCHEMA => 'AIUSER',
106-
P_OBJECT => 'CALL_ANALYZE_IMAGE_API_OBJECTSTORE',
174+
P_OBJECT => 'VISIONAI_OBJECTDETECTION',
107175
P_OBJECT_TYPE => 'FUNCTION',
108-
P_OBJECT_ALIAS => 'call_analyze_image_api_objectstore',
176+
P_OBJECT_ALIAS => 'VISIONAI_OBJECTDETECTION',
109177
P_AUTO_REST_AUTH => FALSE
110178
);
111179
COMMIT;

src/main/java/oracleai/ExplainAndAdviseOnHealthTestResults.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.oracle.bmc.aivision.model.ImageTextDetectionFeature;
55
import oracleai.services.ORDSCalls;
66
import oracleai.services.OracleGenAI;
7+
import oracleai.services.OracleObjectStore;
78
import oracleai.services.OracleVisionAI;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
@@ -31,22 +32,26 @@ public String analyzedoc(@RequestParam("file") MultipartFile multipartFile,
3132
OracleVisionAI.ImageData imageData =
3233
new ObjectMapper().readValue(objectDetectionResults, OracleVisionAI.ImageData.class);
3334
concatenatedText = concatenateText(imageData);
34-
} else concatenatedText = ORDSCalls.analyzeImageInObjectStore(
35-
AIApplication.ORDS_ENDPOINT_URL + "call_analyze_image_api_objectstore",
36-
AIApplication.OCI_VISION_SERVICE_ENDPOINT,
37-
AIApplication.COMPARTMENT_ID,
38-
AIApplication.OBJECTSTORAGE_BUCKETNAME,
39-
AIApplication.OBJECTSTORAGE_NAMESPACE,
40-
multipartFile.getOriginalFilename(), //"objectdetectiontestimage.jpg"
41-
"TEXT_DETECTION",
42-
"MedicalReportSummary");
35+
} else {
36+
OracleObjectStore.sendToObjectStorage(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
37+
concatenatedText = ORDSCalls.analyzeImageInObjectStore(
38+
AIApplication.ORDS_ENDPOINT_URL + "VISIONAI_TEXTDETECTION/",
39+
AIApplication.OCI_VISION_SERVICE_ENDPOINT,
40+
AIApplication.COMPARTMENT_ID,
41+
AIApplication.OBJECTSTORAGE_BUCKETNAME,
42+
AIApplication.OBJECTSTORAGE_NAMESPACE,
43+
multipartFile.getOriginalFilename(), //"objectdetectiontestimage.jpg"
44+
"TEXT_DETECTION",
45+
"MedicalReportSummary");
46+
}
4347
System.out.println(concatenatedText);
4448
log.info("fullText = " + concatenatedText);
4549
String explanationOfResults =
4650
OracleGenAI.chat("explain these test results in simple terms, in less than 100 words, " +
4751
"and tell me what should I do to get better results: \"" + concatenatedText + "\"");
4852
System.out.println("ExplainAndAdviseOnHealthTestResults.analyzedoc explanationOfResults:" + explanationOfResults);
49-
model.addAttribute("results", "SUMMARY WITH ADVICE: " + explanationOfResults);
53+
model.addAttribute("results", "SUMMARY WITH ADVICE: " + explanationOfResults +
54+
" ...This is of course not a substitute for actual medical advice from a professional.");
5055
return "resultspage";
5156
}
5257

src/main/java/oracleai/TextSearch.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class TextSearch {
1616
@PostMapping("/textsearch")
1717
public String textsearch(@RequestParam("sql") String sql, Model model) {
1818
String explanationOfResults = ORDSCalls.executeTextSearchContains(
19-
AIApplication.ORDS_ENDPOINT_URL + "VISIONAI_RESULTS_TEXT_SEARCH", sql);
19+
AIApplication.ORDS_ENDPOINT_URL + "VISIONAI_RESULTS_TEXT_SEARCH/", sql);
2020
model.addAttribute("results", explanationOfResults);
2121
return "resultspage";
2222
}

src/main/java/oracleai/WriteAStoryAboutAPictureAndGiveItsSentiments.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.oracle.bmc.aivision.model.*;
5-
import oracleai.services.ORDSCalls;
6-
import oracleai.services.OracleGenAI;
7-
import oracleai.services.OracleLanguageAI;
8-
import oracleai.services.OracleVisionAI;
5+
import oracleai.services.*;
96
import org.springframework.stereotype.Controller;
107
import org.springframework.web.bind.annotation.*;
118
import org.springframework.web.multipart.MultipartFile;
@@ -31,15 +28,18 @@ public String tellastory(@RequestParam("file") MultipartFile multipartFile, @Req
3128
for (OracleVisionAI.ImageObject image : imageAnalysis.getImageObjects()) fullText += image.getName() + ", ";
3229
System.out.println("WriteAStoryAboutAPictureAndGiveItsSentiments.tellastory images = " + fullText);
3330
}
34-
else fullText = ORDSCalls.analyzeImageInObjectStore(
35-
AIApplication.ORDS_ENDPOINT_URL + "call_analyze_image_api_objectstore",
36-
AIApplication.OCI_VISION_SERVICE_ENDPOINT,
37-
AIApplication.COMPARTMENT_ID,
38-
AIApplication.OBJECTSTORAGE_BUCKETNAME,
39-
AIApplication.OBJECTSTORAGE_NAMESPACE,
40-
multipartFile.getOriginalFilename(), //"objectdetectiontestimage.jpg"
41-
"OBJECT_DETECTION",
42-
"TellAStory");
31+
else {
32+
OracleObjectStore.sendToObjectStorage(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
33+
fullText = ORDSCalls.analyzeImageInObjectStore(
34+
AIApplication.ORDS_ENDPOINT_URL + "VISIONAI_OBJECTDETECTION/",
35+
AIApplication.OCI_VISION_SERVICE_ENDPOINT,
36+
AIApplication.COMPARTMENT_ID,
37+
AIApplication.OBJECTSTORAGE_BUCKETNAME,
38+
AIApplication.OBJECTSTORAGE_NAMESPACE,
39+
multipartFile.getOriginalFilename(), //"objectdetectiontestimage.jpg"
40+
"OBJECT_DETECTION",
41+
"TellAStory");
42+
}
4343
String generatedstory = OracleGenAI.chat("using strong negative and positive sentiments, " +
4444
"write a story that is " + genopts + " and includes " + fullText );
4545
model.addAttribute("results", "STORY: " + generatedstory +

src/main/java/oracleai/services/OracleGenAI.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package oracleai.services;
22

3+
import com.oracle.bmc.Region;
34
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
45
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
56
import com.oracle.bmc.auth.InstancePrincipalsAuthenticationDetailsProvider;
@@ -18,9 +19,9 @@ public class OracleGenAI {
1819

1920

2021
public static String chat(String textcontent) throws Exception {
21-
boolean isConfigFileAuth = true;
2222
AuthenticationDetailsProvider provider = AuthProvider.getAuthenticationDetailsProvider();
23-
GenerativeAiClient generativeAiClient = GenerativeAiClient.builder().build(provider);
23+
//GenAI is only available in US_CHICAGO_1 for current beta, thus the override
24+
GenerativeAiClient generativeAiClient = GenerativeAiClient.builder().region(Region.US_CHICAGO_1).build(provider);
2425
List<String> prompts = Arrays.asList(textcontent);
2526
GenerateTextDetails generateTextDetails = GenerateTextDetails.builder()
2627
.servingMode(OnDemandServingMode.builder().modelId("cohere.command").build()) // "cohere.command-light" is also available to use
@@ -34,11 +35,9 @@ public static String chat(String textcontent) throws Exception {
3435
.isStream(false)
3536
.isEcho(false)
3637
.build();
37-
3838
GenerateTextRequest generateTextRequest = GenerateTextRequest.builder()
3939
.generateTextDetails(generateTextDetails)
4040
.build();
41-
4241
GenerateTextResponse generateTextResponse = generativeAiClient.generateText(generateTextRequest);
4342
GenerateTextResult result = generateTextResponse.getGenerateTextResult();
4443
if(result !=null && result.getGeneratedTexts().size() > 0 ) {

src/main/java/oracleai/services/OracleObjectStore.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package oracleai.services;
22

3-
import com.oracle.bmc.Region;
43
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
54
import com.oracle.bmc.objectstorage.ObjectStorageClient;
65
import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
@@ -20,7 +19,6 @@ public class OracleObjectStore {
2019
public static void sendToObjectStorage(String fileName, InputStream inputStreamForFile) throws Exception {
2120
System.out.println("GenerateAPictureStoryUsingOnlySpeech.sendToObjectStorage fileToUpload:" + fileName);
2221
AuthenticationDetailsProvider provider = AuthProvider.getAuthenticationDetailsProvider();
23-
//Beta Gen AI is only available in chicago, thus the override .region(Region.US_CHICAGO_1)
2422
ObjectStorageClient client = ObjectStorageClient.builder().build(provider);
2523
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
2624
.namespaceName(AIApplication.OBJECTSTORAGE_NAMESPACE)
@@ -35,7 +33,6 @@ public static void sendToObjectStorage(String fileName, InputStream inputStreamF
3533
public static String getFromObjectStorage(String transcriptionJobId, String objectName) throws Exception {
3634
System.out.println("GenerateAPictureStoryUsingOnlySpeech.getFromObjectStorage objectName:" + objectName);
3735
AuthenticationDetailsProvider provider = AuthProvider.getAuthenticationDetailsProvider();
38-
//Beta Gen AI is only available in chicago, thus the override .region(Region.US_CHICAGO_1)
3936
ObjectStorageClient client = ObjectStorageClient.builder().build(provider);
4037
GetObjectRequest putObjectRequest = GetObjectRequest.builder()
4138
.namespaceName(AIApplication.OBJECTSTORAGE_NAMESPACE)

src/main/java/oracleai/services/OracleSpeechAI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class OracleSpeechAI {
1919
public static String getTranscriptFromOCISpeech(String fileName) throws IOException {
2020
AuthenticationDetailsProvider provider = AuthProvider.getAuthenticationDetailsProvider();
2121
AIServiceSpeechClient client =
22-
AIServiceSpeechClient.builder().region(Region.US_CHICAGO_1).build(provider);
22+
AIServiceSpeechClient.builder().build(provider);
2323
CreateTranscriptionJobDetails createTranscriptionJobDetails = CreateTranscriptionJobDetails.builder()
2424
// .displayName("EXAMPLE-displayName-Value")
2525
.compartmentId(AIApplication.COMPARTMENT_ID)

src/main/resources/static/TextSearch.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ <h5>Uses Oracle Text Indexing Searches (and in 23c DBMS_SEARCH multi-table searc
3131
<br>
3232
<form method="post" action="/textsearch/textsearch" enctype="multipart/form-data">
3333
Enter SQL for text search...
34-
<br>&nbsp;&nbsp;&nbsp;&nbsp;select textfromai from aivision_results where CONTAINS ( textfromai, '<input type="text" name="containssql" value="Wine">' ) > 0
34+
<br>&nbsp;&nbsp;&nbsp;&nbsp;select textfromai from aivision_results where CONTAINS ( textfromai, '<input type="text" name="sql" value="Wine">' ) > 0
3535
<br><input type="submit" value="Submit"><br>
3636
<br><b>Example values...</b>
3737
<br>AND/phrase search: 'Wine Glass'

0 commit comments

Comments
 (0)