|  | 
| 1 | 1 | from __future__ import absolute_import, division, print_function | 
| 2 | 2 | 
 | 
|  | 3 | +import json | 
|  | 4 | +import os | 
|  | 5 | + | 
| 3 | 6 | import openai | 
| 4 | 7 | from openai import api_requestor, util | 
| 5 | 8 | from openai.api_resources.abstract import ( | 
| @@ -29,3 +32,59 @@ def create( | 
| 29 | 32 |  return util.convert_to_openai_object( | 
| 30 | 33 |  response, api_key, api_version, organization | 
| 31 | 34 |  ) | 
|  | 35 | + | 
|  | 36 | + @classmethod | 
|  | 37 | + def download( | 
|  | 38 | + cls, id, api_key=None, api_base=None, api_version=None, organization=None | 
|  | 39 | + ): | 
|  | 40 | + requestor = api_requestor.APIRequestor( | 
|  | 41 | + api_key, | 
|  | 42 | + api_base=api_base or openai.file_api_base or openai.api_base, | 
|  | 43 | + api_version=api_version, | 
|  | 44 | + organization=organization, | 
|  | 45 | + ) | 
|  | 46 | + url = f"{cls.class_url()}/{id}/content" | 
|  | 47 | + rbody, rcode, rheaders, _, _ = requestor.request_raw("get", url) | 
|  | 48 | + if not 200 <= rcode < 300: | 
|  | 49 | + raise requestor.handle_error_response( | 
|  | 50 | + rbody, rcode, json.loads(rbody), rheaders, stream_error=False | 
|  | 51 | + ) | 
|  | 52 | + return rbody | 
|  | 53 | + | 
|  | 54 | + @classmethod | 
|  | 55 | + def find_matching_files( | 
|  | 56 | + cls, | 
|  | 57 | + api_key=None, | 
|  | 58 | + api_base=None, | 
|  | 59 | + api_version=None, | 
|  | 60 | + organization=None, | 
|  | 61 | + file=None, | 
|  | 62 | + purpose=None, | 
|  | 63 | + ): | 
|  | 64 | + if file is None: | 
|  | 65 | + raise openai.error.InvalidRequestError( | 
|  | 66 | + "'file' is a required property", "file" | 
|  | 67 | + ) | 
|  | 68 | + if purpose is None: | 
|  | 69 | + raise openai.error.InvalidRequestError( | 
|  | 70 | + "'purpose' is a required property", "purpose" | 
|  | 71 | + ) | 
|  | 72 | + all_files = cls.list( | 
|  | 73 | + api_key=api_key, | 
|  | 74 | + api_base=api_base or openai.file_api_base or openai.api_base, | 
|  | 75 | + api_version=api_version, | 
|  | 76 | + organization=organization, | 
|  | 77 | + ).get("data", []) | 
|  | 78 | + matching_files = [] | 
|  | 79 | + for f in all_files: | 
|  | 80 | + if f["purpose"] != purpose: | 
|  | 81 | + continue | 
|  | 82 | + if not hasattr(file, "name") or f["filename"] != file.name: | 
|  | 83 | + continue | 
|  | 84 | + file.seek(0, os.SEEK_END) | 
|  | 85 | + if f["bytes"] != file.tell(): | 
|  | 86 | + file.seek(0) | 
|  | 87 | + continue | 
|  | 88 | + file.seek(0) | 
|  | 89 | + matching_files.append(f) | 
|  | 90 | + return matching_files | 
0 commit comments