diff --git a/openapi/Makefile b/openapi/Makefile deleted file mode 100644 index 4d0d0cddff..0000000000 --- a/openapi/Makefile +++ /dev/null @@ -1,17 +0,0 @@ - -get_tf_protos: - cd ../proto/tensorflow && make create_protos - cp -R ../proto/tensorflow/tensorflow . - -# Creates a base swagger definition -seldon.grpcapi.swagger.json: get_tf_protos - protoc -I/usr/local/include -I. -I${GOPATH}/src -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway --swagger_out=logtostderr=true:. prediction.grpcapi.proto - -engine.oa3.json apife.oa3.json component.oa3.json: - python create_openapis.py - -clean: - rm -f engine.oa3.json - rm -f apife.oa3.josn - rm -f component.oa3.json - diff --git a/openapi/README.md b/openapi/README.md index 28753485b3..cbade7fe3b 100644 --- a/openapi/README.md +++ b/openapi/README.md @@ -2,8 +2,8 @@ We provide initial [OpenAPI](https://www.openapis.org/) 3.0 specifications for our APIs - * [Seldon Core External via Ambassador](https://github.com/SeldonIO/seldon-core/blob/master/openapi/engine.oas3.json) - * [Seldon Core Internal microservice API](https://github.com/SeldonIO/seldon-core/blob/master/openapi/wrapper.oas3.json) + * [Seldon Core External via Ambassador](https://github.com/SeldonIO/seldon-core/blob/master/openapi/engine.oas3.json) + * [Seldon Core Internal microservice API](https://github.com/SeldonIO/seldon-core/blob/master/openapi/wrapper.oas3.json) You will find the API Specs at runtime at the `/seldon.json` path of your API endpoint. @@ -27,7 +27,7 @@ Open one of the two API specificatons referenced above. For using the Swagger "try it out" feature there are some caveats due to Swagger UI bugs: - * For the [Seldon Core External via API Gateway](https://github.com/SeldonIO/seldon-core/blob/master/openapi/engine.oas3.json) + * For the [Seldon Core External via Ambassador](https://github.com/SeldonIO/seldon-core/blob/master/openapi/engine.oas3.json) * You will need to use a hardwired host, localhost:8002 is provided for Authorization as currently the Swagger UI can't handle variables in Authorization calls. * You will need to use the browser network console to get the bearer token from the returned json as this is not displayed by the Swagger UI. * For the [Seldon Internal API](https://github.com/SeldonIO/seldon-core/blob/master/openapi/wrapper.oas3.json) diff --git a/openapi/base.json b/openapi/base.json deleted file mode 100644 index 5cd0e41ae4..0000000000 --- a/openapi/base.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "Seldon External API", - "version": "0.1", - "contact": { - "name": "Seldon Core", - "url": "https://github.com/SeldonIO/seldon-core" - } - }, - "externalDocs": { - "description": "Seldon Core Documentation", - "url": "https://github.com/SeldonIO/seldon-core" - }, - "servers": [ - { - "url": "http://{host}:{port}", - "variables": { - "host": { - "default": "localhost", - "description": "host running seldon core" - }, - "port": { - "default": "80" - } - } - }, - { - "url": "http://localhost:8002", - "description": "fixed host as swagger UI has bug with variables for auth" - } - - ] -} diff --git a/openapi/components.json b/openapi/components.json deleted file mode 100644 index a712d1c084..0000000000 --- a/openapi/components.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "components": { - "schemas": { - "StatusStatusFlag": { - "type": "string", - "enum": [ - "SUCCESS", - "FAILURE" - ], - "default": "SUCCESS" - }, - "AnyValue": { - "description": "Can be anything: string, number, array, object, etc." - }, - "MetricType": { - "type": "string", - "enum": [ - "COUNTER", - "GAUGE", - "TIMER" - ], - "default": "COUNTER" - }, - "Metric": { - "type": "object", - "properties": { - "type": { - "$ref": "#/components/schemas/MetricType" - }, - "key": { - "type": "string" - }, - "value": { - "type": "number", - "format": "float" - } - } - }, - "DefaultData": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - } - }, - "tensor": { - "$ref": "#/components/schemas/Tensor" - }, - "ndarry": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AnyValue" - } - }, - "tftensor": { - "$ref": "#/components/schemas/TensorflowTensorProto" - } - } - }, - "Feedback": { - "type": "object", - "properties": { - "request": { - "$ref": "#/components/schemas/SeldonMessage" - }, - "response": { - "$ref": "#/components/schemas/SeldonMessage" - }, - "reward": { - "type": "number", - "format": "float" - }, - "truth": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - }, - "Meta": { - "type": "object", - "properties": { - "puid": { - "type": "string" - }, - "tags": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/AnyValue" - }, - "example": { - "mytag": "myvalue" - } - }, - "routing": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - }, - "example": { - "router1": 1 - } - }, - "requestPath": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "example": { - "classifier": "seldonio/mock_classifier:1.0" - } - }, - "metrics": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metric" - } - } - } - }, - "SeldonMessage": { - "type": "object", - "properties": { - "status": { - "$ref": "#/components/schemas/Status" - }, - "meta": { - "$ref": "#/components/schemas/Meta" - }, - "data": { - "$ref": "#/components/schemas/DefaultData" - }, - "binData": { - "type": "string", - "format": "byte" - }, - "strData": { - "type": "string" - } - } - }, - "SeldonMessageList": { - "type": "object", - "properties": { - "seldonMessages": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - }, - "Status": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "info": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "status": { - "$ref": "#/components/schemas/StatusStatusFlag" - } - } - }, - "Tensor": { - "type": "object", - "properties": { - "shape": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "values": { - "type": "array", - "items": { - "type": "number", - "format": "double" - } - } - } - }, - "TensorShapeProtoDim": { - "type": "object", - "properties": { - "size": { - "type": "string", - "format": "int64", - "description": "Size of the tensor in that dimension.\nThis value must be \u003e= -1, but values of -1 are reserved for \"unknown\"\nshapes (values of -1 mean \"unknown\" dimension). Certain wrappers\nthat work with TensorShapeProto may fail at runtime when deserializing\na TensorShapeProto containing a dim value of -1." - }, - "name": { - "type": "string", - "description": "Optional name of the tensor dimension." - } - }, - "description": "One dimension of the tensor." - }, - "TensorflowDataType": { - "type": "string", - "enum": [ - "DT_INVALID", - "DT_FLOAT", - "DT_DOUBLE", - "DT_INT32", - "DT_UINT8", - "DT_INT16", - "DT_INT8", - "DT_STRING", - "DT_COMPLEX64", - "DT_INT64", - "DT_BOOL", - "DT_QINT8", - "DT_QUINT8", - "DT_QINT32", - "DT_BFLOAT16", - "DT_QINT16", - "DT_QUINT16", - "DT_UINT16", - "DT_COMPLEX128", - "DT_HALF", - "DT_RESOURCE", - "DT_VARIANT", - "DT_UINT32", - "DT_UINT64", - "DT_FLOAT_REF", - "DT_DOUBLE_REF", - "DT_INT32_REF", - "DT_UINT8_REF", - "DT_INT16_REF", - "DT_INT8_REF", - "DT_STRING_REF", - "DT_COMPLEX64_REF", - "DT_INT64_REF", - "DT_BOOL_REF", - "DT_QINT8_REF", - "DT_QUINT8_REF", - "DT_QINT32_REF", - "DT_BFLOAT16_REF", - "DT_QINT16_REF", - "DT_QUINT16_REF", - "DT_UINT16_REF", - "DT_COMPLEX128_REF", - "DT_HALF_REF", - "DT_RESOURCE_REF", - "DT_VARIANT_REF", - "DT_UINT32_REF", - "DT_UINT64_REF" - ], - "default": "DT_INVALID", - "description": "- DT_INVALID: Not a legal value for DataType. Used to indicate a DataType field\nhas not been set.\n - DT_FLOAT: Data types that all computation devices are expected to be\ncapable to support.\n - DT_FLOAT_REF: Do not use! These are only for parameters. Every enum above\nshould have a corresponding value below (verified by types_test).", - "title": "LINT.IfChange" - }, - "TensorflowResourceHandleProto": { - "type": "object", - "properties": { - "device": { - "type": "string", - "description": "Unique name for the device containing the resource." - }, - "container": { - "type": "string", - "description": "Container in which this resource is placed." - }, - "name": { - "type": "string", - "description": "Unique name of this resource." - }, - "hash_code": { - "type": "string", - "format": "uint64", - "description": "Hash code for the type of the resource. Is only valid in the same device\nand in the same execution." - }, - "maybe_type_name": { - "type": "string", - "description": "For debug-only, the name of the type pointed to by this handle, if\navailable." - } - }, - "description": "Protocol buffer representing a handle to a tensorflow resource. Handles are\nnot valid across executions, but can be serialized back and forth from within\na single run." - }, - "TensorflowTensorProto": { - "type": "object", - "properties": { - "dtype": { - "$ref": "#/components/schemas/TensorflowDataType" - }, - "tensor_shape": { - "$ref": "#/components/schemas/TensorflowTensorShapeProto", - "description": "Shape of the tensor. TODO(touts): sort out the 0-rank issues." - }, - "version_number": { - "type": "integer", - "format": "int32", - "description": "Version number.\n\nIn version 0, if the \"repeated xxx\" representations contain only one\nelement, that element is repeated to fill the shape. This makes it easy\nto represent a constant Tensor with a single value." - }, - "tensor_content": { - "type": "string", - "format": "byte", - "description": "Serialized raw tensor content from either Tensor::AsProtoTensorContent or\nmemcpy in tensorflow::grpc::EncodeTensorToByteBuffer. This representation\ncan be used for all tensor types. The purpose of this representation is to\nreduce serialization overhead during RPC call by avoiding serialization of\nmany repeated small items." - }, - "half_val": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "description": "DT_HALF, DT_BFLOAT16. Note that since protobuf has no int16 type, we'll\nhave some pointless zero padding for each value here." - }, - "float_val": { - "type": "array", - "items": { - "type": "number", - "format": "float" - }, - "description": "DT_FLOAT." - }, - "double_val": { - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "description": "DT_DOUBLE." - }, - "int_val": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "description": "DT_INT32, DT_INT16, DT_INT8, DT_UINT8." - }, - "string_val": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "DT_STRING" - }, - "scomplex_val": { - "type": "array", - "items": { - "type": "number", - "format": "float" - }, - "description": "DT_COMPLEX64. scomplex_val(2*i) and scomplex_val(2*i+1) are real\nand imaginary parts of i-th single precision complex." - }, - "int64_val": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - }, - "title": "DT_INT64" - }, - "bool_val": { - "type": "array", - "items": { - "type": "boolean", - "format": "boolean" - }, - "title": "DT_BOOL" - }, - "dcomplex_val": { - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "description": "DT_COMPLEX128. dcomplex_val(2*i) and dcomplex_val(2*i+1) are real\nand imaginary parts of i-th double precision complex." - }, - "resource_handle_val": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TensorflowResourceHandleProto" - }, - "title": "DT_RESOURCE" - }, - "variant_val": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TensorflowVariantTensorDataProto" - }, - "title": "DT_VARIANT" - }, - "uint32_val": { - "type": "array", - "items": { - "type": "integer", - "format": "int64" - }, - "title": "DT_UINT32" - }, - "uint64_val": { - "type": "array", - "items": { - "type": "string", - "format": "uint64" - }, - "title": "DT_UINT64" - } - }, - "description": "Protocol buffer representing a tensor." - }, - "TensorflowTensorShapeProto": { - "type": "object", - "properties": { - "dim": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TensorShapeProtoDim" - }, - "description": "Dimensions of the tensor, such as {\"input\", 30}, {\"output\", 40}\nfor a 30 x 40 2D tensor. If an entry has size -1, this\ncorresponds to a dimension of unknown size. The names are\noptional.\n\nThe order of entries in \"dim\" matters: It indicates the layout of the\nvalues in the tensor in-memory representation.\n\nThe first entry in \"dim\" is the outermost dimension used to layout the\nvalues, the last entry is the innermost dimension. This matches the\nin-memory layout of RowMajor Eigen tensors.\n\nIf \"dim.size()\" \u003e 0, \"unknown_rank\" must be false." - }, - "unknown_rank": { - "type": "boolean", - "format": "boolean", - "description": "If true, the number of dimensions in the shape is unknown.\n\nIf true, \"dim.size()\" must be 0." - } - }, - "description": "Dimensions of a tensor." - }, - "TensorflowVariantTensorDataProto": { - "type": "object", - "properties": { - "type_name": { - "type": "string", - "description": "Name of the type of objects being serialized." - }, - "metadata": { - "type": "string", - "format": "byte", - "description": "Portions of the object that are not Tensors." - }, - "tensors": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TensorflowTensorProto" - }, - "description": "Tensors contained within objects being serialized." - } - }, - "description": "Protocol buffer representing the serialization format of DT_VARIANT tensors." - } - - - - } - } -} diff --git a/openapi/create_openapis.py b/openapi/create_openapis.py deleted file mode 100644 index 82045d65e2..0000000000 --- a/openapi/create_openapis.py +++ /dev/null @@ -1,53 +0,0 @@ -import json -import sys - -if __name__ == "__main__": - - with open('base.json') as f: - base = json.load(f) - with open('paths-ambassador.json') as f: - paths_ambassador = json.load(f) - with open('paths-apife.json') as f: - paths_apife = json.load(f) - with open('components.json') as f: - components = json.load(f) - with open('paths-internal.json') as f: - paths_internal = json.load(f) - with open('security.json') as f: - security = json.load(f) - - # - # Create engine.oas3.json - # - base["paths"] = paths_ambassador["paths"] - base["components"] = components["components"] - - with open('engine.oas3.json', 'w') as outfile: - json.dump(base, outfile, indent=4) - - - # - # Create component.swagger.json - # - with open('base.json') as f: - base = json.load(f) - - base["paths"] = paths_internal["paths"] - base["components"] = components["components"] - - with open('wrapper.oas3.json', 'w') as outfile: - json.dump(base, outfile, indent=4) - - # - # Create apife.swagger.json - # - with open('base.json') as f: - base = json.load(f) - - base["paths"] = paths_apife["paths"] - base["components"] = components["components"] - base["components"]["securitySchemes"] = security["securitySchemes"] - base["security"] = security["security"] - - with open('apife.oas3.json', 'w') as outfile: - json.dump(base, outfile, indent=4) diff --git a/openapi/paths-ambassador.json b/openapi/paths-ambassador.json deleted file mode 100644 index 7ee423c42a..0000000000 --- a/openapi/paths-ambassador.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "paths": { - "/seldon/{namespace}/{deployment}/api/v1.0/predictions": { - "post": { - "operationId": "Predict", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "namespace", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "deployment", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "tags": [ - "External Ambassador API" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - }, - "example": { - "data":{ - "names" : ["feature1"], - "tensor" : { - "shape": [1,1], - "values": [1] - } - } - } - } - }, - "required": true - } - } - }, - "/seldon/{namespace}/{deployment}/api/v1.0/feedback": { - "post": { - "operationId": "SendFeedback", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "namespace", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "deployment", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "tags": [ - "External Ambassador API" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Feedback" - } - } - }, - "required": true - } - } - } - } -} diff --git a/openapi/paths-internal.json b/openapi/paths-internal.json deleted file mode 100644 index 1b6f197584..0000000000 --- a/openapi/paths-internal.json +++ /dev/null @@ -1,416 +0,0 @@ -{ - "paths": { - "/aggregate": { - "post": { - "operationId": "Aggregate2", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/SeldonMessageList" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - }, - "get": { - "operationId": "Aggregate", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "body", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/SeldonMessageList" - } - } - ], - "tags": [ - "Internal" - ] - } - }, - "/predict": { - "get": { - "operationId": "TransformInput4", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "json", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - }, - "example": { - "json" : "{\"data\":{\"names\" : [\"feature1\"],\"tensor\" : {\"shape\": [1,1],\"values\": [1]}}}" - } - - } - ], - "tags": [ - "Internal" - ] - }, - "post": { - "operationId": "TransformInput3", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/SeldonMessage" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - } - }, - "/route": { - "get": { - "operationId": "Route2", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "json", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - ], - "tags": [ - "Internal" - ] - }, - "post": { - "operationId": "Route", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/SeldonMessage" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - } - }, - "/send-feedback": { - "get": { - "operationId": "SendFeedback2", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "json", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Feedback" - } - } - ], - "tags": [ - "Internal" - ] - }, - "post": { - "operationId": "SendFeedback", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/Feedback" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - } - }, - "/transform-input": { - "get": { - "operationId": "TransformInput2", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "json", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - ], - "tags": [ - "Internal" - ] - }, - "post": { - "operationId": "TransformInput", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/SeldonMessage" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - } - }, - "/transform-output": { - "get": { - "operationId": "TransformOutput2", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "parameters": [ - { - "name": "json", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - ], - "tags": [ - "Internal" - ] - }, - "post": { - "operationId": "TransformOutput", - "responses": { - "200": { - "description": "A successful response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SeldonMessage" - } - } - } - } - }, - "tags": [ - "Internal" - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type" : "object", - "properties" : { - "json" : { - "$ref": "#/components/schemas/SeldonMessage" - } - } - }, - "encoding" : { - "json" : { - "contentType": "application/json" - } - } - } - }, - "required": true - } - } - } - } -} diff --git a/openapi/security.json b/openapi/security.json deleted file mode 100644 index 1fdf7edd69..0000000000 --- a/openapi/security.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "security": [ - { - "bearerAuth": [] - } - ], - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - }, - "oAuth2ClientCredentials": { - "type": "oauth2", - "flows": { - "clientCredentials": { - "tokenUrl": "/oauth/token", - "scopes": { - "read": "Grants read access", - "write": "Grants write access" - } - } - } - } - } -}