1+ from pydoc import apropos
12import time
23from typing import Optional
34from urllib .parse import quote_plus
45
6+ import openai
57from openai import api_requestor , error , util
68from openai .api_resources .abstract .api_resource import APIResource
79from openai .openai_response import OpenAIResponse
10+ from openai .util import ApiType
811
912MAX_TIMEOUT = 20
1013
1114
1215class EngineAPIResource (APIResource ):
1316 engine_required = True
1417 plain_old_data = False
18+ azure_api_prefix = 'openai/deployments'
1519
1620 def __init__ (self , engine : Optional [str ] = None , ** kwargs ):
1721 super ().__init__ (engine = engine , ** kwargs )
1822
1923 @classmethod
20- def class_url (cls , engine : Optional [str ] = None ):
24+ def class_url (cls , engine : Optional [str ] = None , api_type : Optional [ str ] = None , api_version : Optional [ str ] = None ):
2125 # Namespaces are separated in object names with periods (.) and in URLs
2226 # with forward slashes (/), so replace the former with the latter.
2327 base = cls .OBJECT_NAME .replace ("." , "/" ) # type: ignore
24- if engine is None :
25- return "/%ss" % (base )
28+ typed_api_type = ApiType .from_str (api_type ) if api_type else ApiType .from_str (openai .api_type )
29+ api_version = api_version or openai .api_version
30+
31+ if typed_api_type == ApiType .AZURE :
32+ if not api_version :
33+ raise error .InvalidRequestError ("An API version is required for the Azure API type." )
34+ if engine is None :
35+ raise error .InvalidRequestError (
36+ "You must provide the deployment name in the 'engine' parameter to access the Azure OpenAI service"
37+ )
38+ extn = quote_plus (engine )
39+ return "/%s/%s/%ss?api-version=%s" % (cls .azure_api_prefix , extn , base , api_version )
40+
41+ elif typed_api_type == ApiType .OPEN_AI :
42+ if engine is None :
43+ return "/%ss" % (base )
44+
45+ extn = quote_plus (engine )
46+ return "/engines/%s/%ss" % (extn , base )
47+
48+ else :
49+ raise error .InvalidAPIType ('Unsupported API type %s' % api_type )
2650
27- extn = quote_plus (engine )
28- return "/engines/%s/%ss" % (extn , base )
2951
3052 @classmethod
3153 def create (
3254 cls ,
3355 api_key = None ,
3456 api_base = None ,
57+ api_type = None ,
3558 request_id = None ,
3659 api_version = None ,
3760 organization = None ,
@@ -58,10 +81,11 @@ def create(
5881 requestor = api_requestor .APIRequestor (
5982 api_key ,
6083 api_base = api_base ,
84+ api_type = api_type ,
6185 api_version = api_version ,
6286 organization = organization ,
6387 )
64- url = cls .class_url (engine )
88+ url = cls .class_url (engine , api_type , api_version )
6589 response , _ , api_key = requestor .request (
6690 "post" , url , params , stream = stream , request_id = request_id
6791 )
@@ -103,14 +127,28 @@ def instance_url(self):
103127 "id" ,
104128 )
105129
106- base = self .class_url (self .engine )
107- extn = quote_plus (id )
108- url = "%s/%s" % (base , extn )
130+ params_connector = '?'
131+ if self .typed_api_type == ApiType .AZURE :
132+ api_version = self .api_version or openai .api_version
133+ if not api_version :
134+ raise error .InvalidRequestError ("An API version is required for the Azure API type." )
135+ extn = quote_plus (id )
136+ base = self .OBJECT_NAME .replace ("." , "/" )
137+ url = "/%s/%s/%ss/%s?api-version=%s" % (self .azure_api_prefix , self .engine , base , extn , api_version )
138+ params_connector = '&'
139+
140+ elif self .typed_api_type == ApiType .OPEN_AI :
141+ base = self .class_url (self .engine , self .api_type , self .api_version )
142+ extn = quote_plus (id )
143+ url = "%s/%s" % (base , extn )
144+
145+ else :
146+ raise error .InvalidAPIType ('Unsupported API type %s' % self .api_type )
109147
110148 timeout = self .get ("timeout" )
111149 if timeout is not None :
112150 timeout = quote_plus (str (timeout ))
113- url += "? timeout={}" .format (timeout )
151+ url += params_connector + " timeout={}" .format (timeout )
114152 return url
115153
116154 def wait (self , timeout = None ):
0 commit comments