33from typing import cast
44
55import openai
6- from openai import api_requestor , util
6+ from openai import api_requestor , util , error
77from openai .api_resources .abstract import DeletableAPIResource , ListableAPIResource
8+ from openai .util import ApiType
89
910
1011class File (ListableAPIResource , DeletableAPIResource ):
@@ -18,6 +19,7 @@ def create(
1819 model = None ,
1920 api_key = None ,
2021 api_base = None ,
22+ api_type = None ,
2123 api_version = None ,
2224 organization = None ,
2325 user_provided_filename = None ,
@@ -27,35 +29,61 @@ def create(
2729 requestor = api_requestor .APIRequestor (
2830 api_key ,
2931 api_base = api_base or openai .api_base ,
32+ api_type = api_type ,
3033 api_version = api_version ,
3134 organization = organization ,
3235 )
33- url = cls .class_url ()
36+ typed_api_type , api_version = cls ._get_api_type_and_version (api_type , api_version )
37+
38+ if typed_api_type == ApiType .AZURE :
39+ base = cls .class_url ()
40+ url = "/%s%s?api-version=%s" % (cls .azure_api_prefix , base , api_version )
41+ elif typed_api_type == ApiType .OPEN_AI :
42+ url = cls .class_url ()
43+ else :
44+ raise error .InvalidAPIType ('Unsupported API type %s' % api_type )
45+
3446 # Set the filename on 'purpose' and 'model' to None so they are
3547 # interpreted as form data.
3648 files = [("purpose" , (None , purpose ))]
3749 if model is not None :
3850 files .append (("model" , (None , model )))
3951 if user_provided_filename is not None :
40- files .append (("file" , (user_provided_filename , file )))
52+ files .append (("file" , (user_provided_filename , file , 'application/octet-stream' )))
4153 else :
42- files .append (("file" , file ))
54+ files .append (("file" , file , 'application/octet-stream' ))
4355 response , _ , api_key = requestor .request ("post" , url , files = files )
4456 return util .convert_to_openai_object (
4557 response , api_key , api_version , organization
4658 )
4759
4860 @classmethod
4961 def download (
50- cls , id , api_key = None , api_base = None , api_version = None , organization = None
62+ cls ,
63+ id ,
64+ api_key = None ,
65+ api_base = None ,
66+ api_type = None ,
67+ api_version = None ,
68+ organization = None
5169 ):
5270 requestor = api_requestor .APIRequestor (
5371 api_key ,
5472 api_base = api_base or openai .api_base ,
73+ api_type = api_type ,
5574 api_version = api_version ,
5675 organization = organization ,
5776 )
58- url = f"{ cls .class_url ()} /{ id } /content"
77+ typed_api_type , api_version = cls ._get_api_type_and_version (api_type , api_version )
78+
79+ if typed_api_type == ApiType .AZURE :
80+ base = cls .class_url ()
81+ url = "/%s%s/%s/content?api-version=%s" % (cls .azure_api_prefix , base , id , api_version )
82+ elif typed_api_type == ApiType .OPEN_AI :
83+ url = f"{ cls .class_url ()} /{ id } /content"
84+ else :
85+ raise error .InvalidAPIType ('Unsupported API type %s' % api_type )
86+
5987 result = requestor .request_raw ("get" , url )
6088 if not 200 <= result .status_code < 300 :
6189 raise requestor .handle_error_response (
@@ -75,13 +103,15 @@ def find_matching_files(
75103 purpose ,
76104 api_key = None ,
77105 api_base = None ,
106+ api_type = None ,
78107 api_version = None ,
79108 organization = None ,
80109 ):
81110 """Find already uploaded files with the same name, size, and purpose."""
82111 all_files = cls .list (
83112 api_key = api_key ,
84113 api_base = api_base or openai .api_base ,
114+ api_type = api_type ,
85115 api_version = api_version ,
86116 organization = organization ,
87117 ).get ("data" , [])
@@ -93,7 +123,9 @@ def find_matching_files(
93123 file_basename = os .path .basename (f ["filename" ])
94124 if file_basename != basename :
95125 continue
96- if f ["bytes" ] != bytes :
126+ if "bytes" in f and f ["bytes" ] != bytes :
127+ continue
128+ if "size" in f and int (f ["size" ]) != bytes :
97129 continue
98130 matching_files .append (f )
99131 return matching_files
0 commit comments