openai/openai-python

Public

mirrored from https://github.com/openai/openai-pythonAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.11.4

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

openai/api_resources/abstract/engine_api_resource.py

128lines · modecode

1import time
2from typing import Optional
3from urllib.parse import quote_plus
4
5from openai import api_requestor, error, util
6from openai.api_resources.abstract.api_resource import APIResource
7from openai.openai_response import OpenAIResponse
8
9MAX_TIMEOUT = 20
10
11
12class EngineAPIResource(APIResource):
13 engine_required = True
14 plain_old_data = False
15
16 def __init__(self, engine: Optional[str] = None, **kwargs):
17 super().__init__(engine=engine, **kwargs)
18
19 @classmethod
20 def class_url(cls, engine: Optional[str] = None):
21 # Namespaces are separated in object names with periods (.) and in URLs
22 # with forward slashes (/), so replace the former with the latter.
23 base = cls.OBJECT_NAME.replace(".", "/") # type: ignore
24 if engine is None:
25 return "/%ss" % (base)
26
27 extn = quote_plus(engine)
28 return "/engines/%s/%ss" % (extn, base)
29
30 @classmethod
31 def create(
32 cls,
33 api_key=None,
34 api_base=None,
35 request_id=None,
36 api_version=None,
37 organization=None,
38 **params,
39 ):
40 engine = params.pop("engine", None)
41 timeout = params.pop("timeout", None)
42 stream = params.get("stream", False)
43 if engine is None and cls.engine_required:
44 raise error.InvalidRequestError(
45 "Must provide an 'engine' parameter to create a %s" % cls, "engine"
46 )
47
48 if timeout is None:
49 # No special timeout handling
50 pass
51 elif timeout > 0:
52 # API only supports timeouts up to MAX_TIMEOUT
53 params["timeout"] = min(timeout, MAX_TIMEOUT)
54 timeout = (timeout - params["timeout"]) or None
55 elif timeout == 0:
56 params["timeout"] = MAX_TIMEOUT
57
58 requestor = api_requestor.APIRequestor(
59 api_key,
60 api_base=api_base,
61 api_version=api_version,
62 organization=organization,
63 )
64 url = cls.class_url(engine)
65 response, _, api_key = requestor.request(
66 "post", url, params, stream=stream, request_id=request_id
67 )
68
69 if stream:
70 assert not isinstance(response, OpenAIResponse) # must be an iterator
71 return (
72 util.convert_to_openai_object(
73 line,
74 api_key,
75 api_version,
76 organization,
77 engine=engine,
78 plain_old_data=cls.plain_old_data,
79 )
80 for line in response
81 )
82 else:
83 obj = util.convert_to_openai_object(
84 response,
85 api_key,
86 api_version,
87 organization,
88 engine=engine,
89 plain_old_data=cls.plain_old_data,
90 )
91
92 if timeout is not None:
93 obj.wait(timeout=timeout or None)
94
95 return obj
96
97 def instance_url(self):
98 id = self.get("id")
99
100 if not isinstance(id, str):
101 raise error.InvalidRequestError(
102 f"Could not determine which URL to request: {type(self).__name__} instance has invalid ID: {id}, {type(id)}. ID should be of type str.",
103 "id",
104 )
105
106 base = self.class_url(self.engine)
107 extn = quote_plus(id)
108 url = "%s/%s" % (base, extn)
109
110 timeout = self.get("timeout")
111 if timeout is not None:
112 timeout = quote_plus(str(timeout))
113 url += "?timeout={}".format(timeout)
114 return url
115
116 def wait(self, timeout=None):
117 start = time.time()
118 while self.status != "complete":
119 self.timeout = (
120 min(timeout + start - time.time(), MAX_TIMEOUT)
121 if timeout is not None
122 else MAX_TIMEOUT
123 )
124 if self.timeout < 0:
125 del self.timeout
126 break
127 self.refresh()
128 return self
129