Skip to content

Commit 55bd605

Browse files
authored
Merge pull request #25 from matlab-deep-learning/main
Create pull request to to update activate-code-coverage with new content from main
2 parents 59c8d8d + 3d35464 commit 55bd605

9 files changed

+66
-13
lines changed

+llms/+utils/errorMessageCatalog.m

+1
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,5 @@
5555
catalog("llms:pngExpected") = "Argument must be a PNG image.";
5656
catalog("llms:warningJsonInstruction") = "When using JSON mode, you must also prompt the model to produce JSON yourself via a system or user message.";
5757
catalog("llms:apiReturnedError") = "OpenAI API Error: {1}";
58+
catalog("llms:dimensionsMustBeSmallerThan") = "Dimensions must be less than or equal to {1}.";
5859
end
Binary file not shown.
Binary file not shown.
-6.46 KB
Binary file not shown.

extractOpenAIEmbeddings.m

+17-3
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@
2020
% [emb, response] = EXTRACTOPENAIEMBEDDINGS(...) also returns the full
2121
% response from the OpenAI API call.
2222
%
23-
% Copyright 2023 The MathWorks, Inc.
23+
% Copyright 2023-2024 The MathWorks, Inc.
2424

2525
arguments
26-
text (1,:) {mustBeText}
26+
text (1,:) {mustBeNonzeroLengthText}
2727
nvp.ModelName (1,1) {mustBeMember(nvp.ModelName,["text-embedding-ada-002", ...
2828
"text-embedding-3-large", "text-embedding-3-small"])} = "text-embedding-ada-002"
2929
nvp.TimeOut (1,1) {mustBeReal,mustBePositive} = 10
30-
nvp.Dimensions (1,1) {mustBeInteger}
30+
nvp.Dimensions (1,1) {mustBeInteger,mustBePositive}
3131
nvp.ApiKey {llms.utils.mustBeNonzeroLengthTextScalar}
3232
end
3333

@@ -42,6 +42,7 @@
4242
error("llms:invalidOptionForModel", ...
4343
llms.utils.errorMessageCatalog.getMessage("llms:invalidOptionForModel", "Dimensions", nvp.ModelName));
4444
end
45+
mustBeCorrectDimensions(nvp.Dimensions,nvp.ModelName);
4546
parameters.dimensions = nvp.Dimensions;
4647
end
4748

@@ -53,4 +54,17 @@
5354
emb = emb';
5455
else
5556
emb = [];
57+
end
58+
end
59+
60+
function mustBeCorrectDimensions(dimensions,modelName)
61+
model2dim = ....
62+
dictionary(["text-embedding-3-large", "text-embedding-3-small"], ...
63+
[3072,1536]);
64+
65+
if dimensions>model2dim(modelName)
66+
error("llms:dimensionsMustBeSmallerThan", ...
67+
llms.utils.errorMessageCatalog.getMessage("llms:dimensionsMustBeSmallerThan", ...
68+
string(model2dim(modelName))));
69+
end
5670
end

openAIImages.m

+6-4
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@
8585
% Only "dall-e-3" supports this parameter.
8686

8787
arguments
88-
this (1,1) openAIImages
89-
prompt {mustBeTextScalar}
88+
this (1,1) openAIImages
89+
prompt {mustBeNonzeroLengthTextScalar}
9090
nvp.NumImages (1,1) {mustBePositive, mustBeInteger,...
9191
mustBeLessThanOrEqual(nvp.NumImages,10)} = 1
9292
nvp.Size (1,1) string {mustBeMember(nvp.Size, ["256x256", "512x512", ...
@@ -176,7 +176,7 @@
176176
arguments
177177
this (1,1) openAIImages
178178
imagePath {mustBeValidFileType(imagePath)}
179-
prompt {mustBeTextScalar}
179+
prompt {mustBeNonzeroLengthTextScalar}
180180
nvp.MaskImagePath {mustBeValidFileType(nvp.MaskImagePath)}
181181
nvp.NumImages (1,1) {mustBePositive, mustBeInteger,...
182182
mustBeLessThanOrEqual(nvp.NumImages,10)} = 1
@@ -345,7 +345,9 @@ function validatePromptSize(model, prompt)
345345
function mustBeValidFileType(filePath)
346346
mustBeFile(filePath);
347347
s = dir(filePath);
348-
if ~endsWith(s.name, ".png")
348+
imgDetails = imfinfo(filePath);
349+
imgFormat = imgDetails.Format;
350+
if ~(imgFormat=="png")
349351
error("llms:pngExpected", ...
350352
llms.utils.errorMessageCatalog.getMessage("llms:pngExpected"));
351353
end

tests/test_files/solar.png

64.7 KB
Loading

tests/textractOpenAIEmbeddings.m

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
classdef textractOpenAIEmbeddings < matlab.unittest.TestCase
22
% Tests for extractOpenAIEmbeddings
33

4-
% Copyright 2023 The MathWorks, Inc.
4+
% Copyright 2023-2024 The MathWorks, Inc.
55

66
methods (TestClassSetup)
77
function saveEnvVar(testCase)
@@ -56,6 +56,14 @@ function testInvalidInputs(testCase, InvalidInput)
5656

5757
function invalidInput = iGetInvalidInput
5858
invalidInput = struct( ...
59+
"InvalidEmptyText", struct( ...
60+
"Input",{{ "" }},...
61+
"Error", "MATLAB:validators:mustBeNonzeroLengthText"), ...
62+
...
63+
"InvalidEmptyTextArray", struct( ...
64+
"Input",{{ ["", ""] }},...
65+
"Error", "MATLAB:validators:mustBeNonzeroLengthText"), ...
66+
...
5967
"InvalidTimeOutType", struct( ...
6068
"Input",{{ "bla", "TimeOut", "2" }},...
6169
"Error", "MATLAB:validators:mustBeReal"), ...
@@ -66,7 +74,7 @@ function testInvalidInputs(testCase, InvalidInput)
6674
...
6775
"WrongTypeText",struct( ...
6876
"Input",{{ 123 }},...
69-
"Error","MATLAB:validators:mustBeText"),...
77+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
7078
...
7179
"InvalidModelNameType",struct( ...
7280
"Input",{{"bla", "ModelName", 0 }},...
@@ -84,6 +92,20 @@ function testInvalidInputs(testCase, InvalidInput)
8492
"Input",{{"bla", "Dimensions", "123" }},...
8593
"Error","MATLAB:validators:mustBeNumericOrLogical"),...
8694
...
95+
"InvalidDimensionValue",struct( ...
96+
"Input",{{"bla", "Dimensions", "-11" }},...
97+
"Error","MATLAB:validators:mustBeNumericOrLogical"),...
98+
...
99+
"LargeDimensionValueForModelLarge",struct( ...
100+
"Input",{{"bla", "ModelName", "text-embedding-3-large", ...
101+
"Dimensions", 3073, "ApiKey", "fake-key" }},...
102+
"Error","llms:dimensionsMustBeSmallerThan"),...
103+
...
104+
"LargeDimensionValueForModelSmall",struct( ...
105+
"Input",{{"bla", "ModelName", "text-embedding-3-small", ...
106+
"Dimensions", 1537, "ApiKey", "fake-key" }},...
107+
"Error","llms:dimensionsMustBeSmallerThan"),...
108+
...
87109
"InvalidDimensionSize",struct( ...
88110
"Input",{{"bla", "Dimensions", [123, 123] }},...
89111
"Error","MATLAB:validation:IncompatibleSize"),...

tests/topenAIImages.m

+18-4
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ function constructModelWithAllNVP(testCase)
105105
testCase.verifyEqual(mdl.ModelName, modelName);
106106
end
107107

108+
function fakePNGImage(testCase)
109+
mdl = openAIImages(ApiKey="this-is-not-a-real-key");
110+
fakePng = fullfile("test_files", "solar.png");
111+
testCase.verifyError(@()edit(mdl,fakePng, "bla"), "llms:pngExpected");
112+
end
113+
108114
function invalidInputsConstructor(testCase, InvalidConstructorInput)
109115
testCase.verifyError(@()openAIImages(InvalidConstructorInput.Input{:}), InvalidConstructorInput.Error);
110116
end
@@ -157,11 +163,15 @@ function invalidInputsVariation(testCase, InvalidVariationInput)
157163
invalidGenerateInput = struct( ...
158164
"EmptyInput",struct( ...
159165
"Input",{{ [] }},...
160-
"Error","MATLAB:validators:mustBeTextScalar"),...
166+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
161167
...
162168
"InvalidInputType",struct( ...
163169
"Input",{{ 123 }},...
164-
"Error","MATLAB:validators:mustBeTextScalar"),...
170+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
171+
...
172+
"InvalidPromptLen",struct( ...
173+
"Input",{{ "" }},...
174+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
165175
...
166176
"InvalidNumImagesType",struct( ...
167177
"Input",{{ "prompt" "NumImages" "2" }},...
@@ -233,17 +243,21 @@ function invalidInputsVariation(testCase, InvalidVariationInput)
233243
"Input",{{ 123, "prompt" }},...
234244
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
235245
...
246+
"InvalidPromptLen",struct( ...
247+
"Input",{{ validImage, "" }},...
248+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
249+
...
236250
"InvalidImageExtension",struct( ...
237251
"Input",{{ nonPNGImage, "prompt" }},...
238252
"Error","llms:pngExpected"),...
239253
...
240254
"EmptyPrompt",struct( ...
241255
"Input",{{ validImage, [] }},...
242-
"Error","MATLAB:validators:mustBeTextScalar"),...
256+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
243257
...
244258
"InvalidPromptType",struct( ...
245259
"Input",{{ validImage, 123 }},...
246-
"Error","MATLAB:validators:mustBeTextScalar"),...
260+
"Error","MATLAB:validators:mustBeNonzeroLengthText"),...
247261
...
248262
"InvalidMaskImage",struct( ...
249263
"Input",{{ validImage, "foo", "MaskImagePath", 123 }},...

0 commit comments

Comments
 (0)