diff --git a/api-prompt-object.go b/api-prompt-object.go new file mode 100644 index 000000000..9a88d5d99 --- /dev/null +++ b/api-prompt-object.go @@ -0,0 +1,88 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "github.com/goccy/go-json" + "github.com/minio/minio-go/v7/pkg/s3utils" +) + +// PromptObject wrapper function that accepts a request context +func (c *Client) PromptObject(ctx context.Context, bucketName, objectName string, prompt string, opts PromptObjectOptions) (string, error) { + // Input validation. + if err := s3utils.CheckValidBucketName(bucketName); err != nil { + return "", ErrorResponse{ + StatusCode: http.StatusBadRequest, + Code: "InvalidBucketName", + Message: err.Error(), + } + } + if err := s3utils.CheckValidObjectName(objectName); err != nil { + return "", ErrorResponse{ + StatusCode: http.StatusBadRequest, + Code: "XMinioInvalidObjectName", + Message: err.Error(), + } + } + + opts.AddLambdaArnToReqParams(opts.LambdaArn) + opts.SetHeader("Content-Type", "application/json") + opts.AddKwarg("prompt", prompt) + promptReqBytes, err := json.Marshal(opts.Kwargs) + if err != nil { + return "", err + } + + // Execute POST on bucket/object. + resp, err := c.executeMethod(ctx, http.MethodPost, requestMetadata{ + bucketName: bucketName, + objectName: objectName, + queryValues: opts.toQueryValues(), + customHeader: opts.Header(), + contentSHA256Hex: sum256Hex(promptReqBytes), + contentBody: bytes.NewReader(promptReqBytes), + contentLength: int64(len(promptReqBytes)), + }) + if err != nil { + return "", err + } + // Return string that is returned as HttpResponse + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + fmt.Println("Error closing body") + return + } + }(resp.Body) + + // Read the response body + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + + // Convert to string and return + responseString := string(bodyBytes) + return responseString, nil +} diff --git a/api-prompt-options.go b/api-prompt-options.go new file mode 100644 index 000000000..a817539ba --- /dev/null +++ b/api-prompt-options.go @@ -0,0 +1,110 @@ +/* + * MinIO Go Library for Amazon S3 Compatible Cloud Storage + * Copyright 2015-2020 MinIO, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package minio + +import ( + "net/http" + "net/url" +) + +// PromptObjectOptions provides options to PromptObject call. +// LambdaArn is the ARN of the Prompt Lambda to be invoked. +// Kwargs is a map of key-value pairs to be passed to the inference action on the Prompt Lambda. +type PromptObjectOptions struct { + LambdaArn string + Kwargs map[string]interface{} + headers map[string]string + reqParams url.Values +} + +// Header returns the http.Header representation of the POST options. +func (o PromptObjectOptions) Header() http.Header { + headers := make(http.Header, len(o.headers)) + for k, v := range o.headers { + headers.Set(k, v) + } + return headers +} + +// AddKwarg Add a key value pair to the kwargs where the key is a string but the value can be any type. +func (o *PromptObjectOptions) AddKwarg(key string, value interface{}) { + if o.Kwargs == nil { + o.Kwargs = make(map[string]interface{}) + } + o.Kwargs[key] = value +} + +// AddLambdaArnToReqParams adds the lambdaArn to the request query string parameters. +func (o *PromptObjectOptions) AddLambdaArnToReqParams(lambdaArn string) { + if o.reqParams == nil { + o.reqParams = make(url.Values) + } + o.reqParams.Add("lambdaArn", lambdaArn) +} + +// SetHeader adds a key value pair to the options. The +// key-value pair will be part of the HTTP POST request +// headers. +func (o *PromptObjectOptions) SetHeader(key, value string) { + if o.headers == nil { + o.headers = make(map[string]string) + } + o.headers[http.CanonicalHeaderKey(key)] = value +} + +// SetReqParam - set request query string parameter +// supported key: see supportedQueryValues and allowedCustomQueryPrefix. +// If an unsupported key is passed in, it will be ignored and nothing will be done. +func (o *PromptObjectOptions) SetReqParam(key, value string) { + if !isCustomQueryValue(key) && !isStandardQueryValue(key) { + // do nothing + return + } + if o.reqParams == nil { + o.reqParams = make(url.Values) + } + o.reqParams.Set(key, value) +} + +// AddReqParam - add request query string parameter +// supported key: see supportedQueryValues and allowedCustomQueryPrefix. +// If an unsupported key is passed in, it will be ignored and nothing will be done. +func (o *PromptObjectOptions) AddReqParam(key, value string) { + if !isCustomQueryValue(key) && !isStandardQueryValue(key) { + // do nothing + return + } + if o.reqParams == nil { + o.reqParams = make(url.Values) + } + o.reqParams.Add(key, value) +} + +// toQueryValues - Convert the reqParams in Options to query string parameters. +func (o *PromptObjectOptions) toQueryValues() url.Values { + urlValues := make(url.Values) + if o.reqParams != nil { + for key, values := range o.reqParams { + for _, value := range values { + urlValues.Add(key, value) + } + } + } + + return urlValues +}