Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions openai/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
ErrorObject,
File,
FineTune,
FineTuningJob,
Image,
Model,
Moderation,
Expand Down Expand Up @@ -84,6 +85,7 @@
"ErrorObject",
"File",
"FineTune",
"FineTuningJob",
"InvalidRequestError",
"Model",
"Moderation",
Expand Down
1 change: 1 addition & 0 deletions openai/api_resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from openai.api_resources.error_object import ErrorObject # noqa: F401
from openai.api_resources.file import File # noqa: F401
from openai.api_resources.fine_tune import FineTune # noqa: F401
from openai.api_resources.fine_tuning import FineTuningJob # noqa: F401
from openai.api_resources.image import Image # noqa: F401
from openai.api_resources.model import Model # noqa: F401
from openai.api_resources.moderation import Moderation # noqa: F401
3 changes: 3 additions & 0 deletions openai/api_resources/abstract/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@
from openai.api_resources.abstract.nested_resource_class_methods import (
nested_resource_class_methods,
)
from openai.api_resources.abstract.paginatable_api_resource import (
PaginatableAPIResource,
)
from openai.api_resources.abstract.updateable_api_resource import UpdateableAPIResource
13 changes: 13 additions & 0 deletions openai/api_resources/abstract/nested_resource_class_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,19 @@ def list_nested_resources(cls, id, **params):
list_method = "list_%s" % resource_plural
setattr(cls, list_method, classmethod(list_nested_resources))

elif operation == "paginated_list":

def paginated_list_nested_resources(
cls, id, limit=None, cursor=None, **params
):
url = getattr(cls, resource_url_method)(id)
return getattr(cls, resource_request_method)(
"get", url, limit=limit, cursor=cursor, **params
)

list_method = "list_%s" % resource_plural
setattr(cls, list_method, classmethod(paginated_list_nested_resources))

else:
raise ValueError("Unknown operation: %s" % operation)

Expand Down
125 changes: 125 additions & 0 deletions openai/api_resources/abstract/paginatable_api_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
from openai import api_requestor, error, util
from openai.api_resources.abstract.listable_api_resource import ListableAPIResource
from openai.util import ApiType


class PaginatableAPIResource(ListableAPIResource):
@classmethod
def auto_paging_iter(cls, *args, **params):
next_cursor = None
has_more = True
if not params.get("limit"):
params["limit"] = 20
while has_more:
if next_cursor:
params["after"] = next_cursor
response = cls.list(*args, **params)

for item in response.data:
yield item

if response.data:
next_cursor = response.data[-1].id
has_more = response.has_more

@classmethod
def __prepare_list_requestor(
cls,
api_key=None,
api_version=None,
organization=None,
api_base=None,
api_type=None,
):
requestor = api_requestor.APIRequestor(
api_key,
api_base=api_base or cls.api_base(),
api_version=api_version,
api_type=api_type,
organization=organization,
)

typed_api_type, api_version = cls._get_api_type_and_version(
api_type, api_version
)

if typed_api_type in (ApiType.AZURE, ApiType.AZURE_AD):
base = cls.class_url()
url = "/%s%s?api-version=%s" % (cls.azure_api_prefix, base, api_version)
elif typed_api_type == ApiType.OPEN_AI:
url = cls.class_url()
else:
raise error.InvalidAPIType("Unsupported API type %s" % api_type)
return requestor, url

@classmethod
def list(
cls,
limit=None,
starting_after=None,
api_key=None,
request_id=None,
api_version=None,
organization=None,
api_base=None,
api_type=None,
**params,
):
requestor, url = cls.__prepare_list_requestor(
api_key,
api_version,
organization,
api_base,
api_type,
)

params = {
**params,
"limit": limit,
"starting_after": starting_after,
}

response, _, api_key = requestor.request(
"get", url, params, request_id=request_id
)
openai_object = util.convert_to_openai_object(
response, api_key, api_version, organization
)
openai_object._retrieve_params = params
return openai_object

@classmethod
async def alist(
cls,
limit=None,
starting_after=None,
api_key=None,
request_id=None,
api_version=None,
organization=None,
api_base=None,
api_type=None,
**params,
):
requestor, url = cls.__prepare_list_requestor(
api_key,
api_version,
organization,
api_base,
api_type,
)

params = {
**params,
"limit": limit,
"starting_after": starting_after,
}

response, _, api_key = await requestor.arequest(
"get", url, params, request_id=request_id
)
openai_object = util.convert_to_openai_object(
response, api_key, api_version, organization
)
openai_object._retrieve_params = params
return openai_object
2 changes: 1 addition & 1 deletion openai/api_resources/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ async def adownload(
return result.content

@classmethod
def __find_matching_files(cls, name, bytes, all_files, purpose):
def __find_matching_files(cls, name, bytes, all_files, purpose)
matching_files = []
basename = os.path.basename(name)
for f in all_files:
Expand Down
88 changes: 88 additions & 0 deletions openai/api_resources/fine_tuning.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from urllib.parse import quote_plus

from openai import error
from openai.api_resources.abstract import (
CreateableAPIResource,
PaginatableAPIResource,
nested_resource_class_methods,
)
from openai.api_resources.abstract.deletable_api_resource import DeletableAPIResource
from openai.util import ApiType


@nested_resource_class_methods("event", operations=["paginated_list"])
class FineTuningJob(
PaginatableAPIResource, CreateableAPIResource, DeletableAPIResource
):
OBJECT_NAME = "fine_tuning.jobs"

@classmethod
def _prepare_cancel(
cls,
id,
api_key=None,
api_type=None,
request_id=None,
api_version=None,
**params,
):
base = cls.class_url()
extn = quote_plus(id)

typed_api_type, api_version = cls._get_api_type_and_version(
api_type, api_version
)
if typed_api_type in (ApiType.AZURE, ApiType.AZURE_AD):
url = "/%s%s/%s/cancel?api-version=%s" % (
cls.azure_api_prefix,
base,
extn,
api_version,
)
elif typed_api_type == ApiType.OPEN_AI:
url = "%s/%s/cancel" % (base, extn)
else:
raise error.InvalidAPIType("Unsupported API type %s" % api_type)

instance = cls(id, api_key, **params)
return instance, url

@classmethod
def cancel(
cls,
id,
api_key=None,
api_type=None,
request_id=None,
api_version=None,
**params,
):
instance, url = cls._prepare_cancel(
id,
api_key,
api_type,
request_id,
api_version,
**params,
)
return instance.request("post", url, request_id=request_id)

@classmethod
def acancel(
cls,
id,
api_key=None,
api_type=None,
request_id=None,
api_version=None,
**params,
):
instance, url = cls._prepare_cancel(
id,
api_key,
api_type,
request_id,
api_version,
**params,
)
return instance.arequest("post", url, request_id=request_id)
1 change: 1 addition & 0 deletions openai/object_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
"fine-tune": api_resources.FineTune,
"model": api_resources.Model,
"deployment": api_resources.Deployment,
"fine_tuning.job": api_resources.FineTuningJob,
}