openai/openai-python

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.26.4

Branches

Tags

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

Clone

HTTPS

Download ZIP

openai/api_resources/file.py

261lines · modeblame

7ddcba1aRachel Lim5 years ago1import json
2import os
62f8d40fMadeleine Thompson4 years ago3from typing import cast
7ddcba1aRachel Lim5 years ago4
3c6d4cd6Greg Brockman5 years ago5import openai
02e4008dSorin Suciu4 years ago6from openai import api_requestor, util, error
62f8d40fMadeleine Thompson4 years ago7from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResource
02e4008dSorin Suciu4 years ago8from openai.util import ApiType
3c6d4cd6Greg Brockman5 years ago9
10
4e381798hallacy5 years ago11class File(ListableAPIResource, DeletableAPIResource):
64c45330hallacy4 years ago12OBJECT_NAME = "files"
3c6d4cd6Greg Brockman5 years ago13
14@classmethod
0abf6413Andrew Chen Wang3 years ago15def __prepare_file_create(
62f8d40fMadeleine Thompson4 years ago16cls,
17file,
18purpose,
19model=None,
20api_key=None,
21api_base=None,
02e4008dSorin Suciu4 years ago22api_type=None,
62f8d40fMadeleine Thompson4 years ago23api_version=None,
24organization=None,
f4f6f90cRachel Lim4 years ago25user_provided_filename=None,
3c6d4cd6Greg Brockman5 years ago26):
27requestor = api_requestor.APIRequestor(
28api_key,
62f8d40fMadeleine Thompson4 years ago29api_base=api_base or openai.api_base,
02e4008dSorin Suciu4 years ago30api_type=api_type,
3c6d4cd6Greg Brockman5 years ago31api_version=api_version,
32organization=organization,
33)
53e5ba4bt-asutedjo4 years ago34typed_api_type, api_version = cls._get_api_type_and_version(
7884a7b9Ted Sanders3 years ago35api_type, api_version
36)
02e4008dSorin Suciu4 years ago37
53e5ba4bt-asutedjo4 years ago38if typed_api_type in (ApiType.AZURE, ApiType.AZURE_AD):
02e4008dSorin Suciu4 years ago39base = cls.class_url()
7884a7b9Ted Sanders3 years ago40url = "/%s%s?api-version=%s" % (cls.azure_api_prefix, base, api_version)
02e4008dSorin Suciu4 years ago41elif typed_api_type == ApiType.OPEN_AI:
42url = cls.class_url()
43else:
7884a7b9Ted Sanders3 years ago44raise error.InvalidAPIType("Unsupported API type %s" % api_type)
02e4008dSorin Suciu4 years ago45
62f8d40fMadeleine Thompson4 years ago46# Set the filename on 'purpose' and 'model' to None so they are
47# interpreted as form data.
f4f6f90cRachel Lim4 years ago48files = [("purpose", (None, purpose))]
62f8d40fMadeleine Thompson4 years ago49if model is not None:
50files.append(("model", (None, model)))
f4f6f90cRachel Lim4 years ago51if user_provided_filename is not None:
53e5ba4bt-asutedjo4 years ago52files.append(
7884a7b9Ted Sanders3 years ago53("file", (user_provided_filename, file, "application/octet-stream"))
54)
f4f6f90cRachel Lim4 years ago55else:
7884a7b9Ted Sanders3 years ago56files.append(("file", ("file", file, "application/octet-stream")))
0abf6413Andrew Chen Wang3 years ago57
58return requestor, url, files
59
60@classmethod
61def create(
62cls,
63file,
64purpose,
65model=None,
66api_key=None,
67api_base=None,
68api_type=None,
69api_version=None,
70organization=None,
71user_provided_filename=None,
72):
73requestor, url, files = cls.__prepare_file_create(
74file,
75purpose,
76model,
77api_key,
78api_base,
79api_type,
80api_version,
81organization,
82user_provided_filename,
83)
62f8d40fMadeleine Thompson4 years ago84response, _, api_key = requestor.request("post", url, files=files)
3c6d4cd6Greg Brockman5 years ago85return util.convert_to_openai_object(
86response, api_key, api_version, organization
87)
7ddcba1aRachel Lim5 years ago88
89@classmethod
0abf6413Andrew Chen Wang3 years ago90async def acreate(
91cls,
92file,
93purpose,
94model=None,
95api_key=None,
96api_base=None,
97api_type=None,
98api_version=None,
99organization=None,
100user_provided_filename=None,
101):
102requestor, url, files = cls.__prepare_file_create(
103file,
104purpose,
105model,
106api_key,
107api_base,
108api_type,
109api_version,
110organization,
111user_provided_filename,
112)
113response, _, api_key = await requestor.arequest("post", url, files=files)
114return util.convert_to_openai_object(
115response, api_key, api_version, organization
116)
117
118@classmethod
119def __prepare_file_download(
53e5ba4bt-asutedjo4 years ago120cls,
121id,
122api_key=None,
02e4008dSorin Suciu4 years ago123api_base=None,
124api_type=None,
53e5ba4bt-asutedjo4 years ago125api_version=None,
7884a7b9Ted Sanders3 years ago126organization=None,
7ddcba1aRachel Lim5 years ago127):
128requestor = api_requestor.APIRequestor(
129api_key,
62f8d40fMadeleine Thompson4 years ago130api_base=api_base or openai.api_base,
02e4008dSorin Suciu4 years ago131api_type=api_type,
7ddcba1aRachel Lim5 years ago132api_version=api_version,
133organization=organization,
134)
53e5ba4bt-asutedjo4 years ago135typed_api_type, api_version = cls._get_api_type_and_version(
7884a7b9Ted Sanders3 years ago136api_type, api_version
137)
02e4008dSorin Suciu4 years ago138
53e5ba4bt-asutedjo4 years ago139if typed_api_type in (ApiType.AZURE, ApiType.AZURE_AD):
02e4008dSorin Suciu4 years ago140base = cls.class_url()
88b267b9James Chua3 years ago141url = f"/{cls.azure_api_prefix}{base}/{id}/content?api-version={api_version}"
02e4008dSorin Suciu4 years ago142elif typed_api_type == ApiType.OPEN_AI:
88b267b9James Chua3 years ago143url = f"{cls.class_url()}/{id}/content"
02e4008dSorin Suciu4 years ago144else:
7884a7b9Ted Sanders3 years ago145raise error.InvalidAPIType("Unsupported API type %s" % api_type)
53e5ba4bt-asutedjo4 years ago146
0abf6413Andrew Chen Wang3 years ago147return requestor, url
148
149@classmethod
150def download(
151cls,
152id,
153api_key=None,
154api_base=None,
155api_type=None,
156api_version=None,
157organization=None,
158):
159requestor, url = cls.__prepare_file_download(
160id, api_key, api_base, api_type, api_version, organization
161)
162
62f8d40fMadeleine Thompson4 years ago163result = requestor.request_raw("get", url)
164if not 200 <= result.status_code < 300:
7ddcba1aRachel Lim5 years ago165raise requestor.handle_error_response(
62f8d40fMadeleine Thompson4 years ago166result.content,
167result.status_code,
168json.loads(cast(bytes, result.content)),
169result.headers,
170stream_error=False,
7ddcba1aRachel Lim5 years ago171)
62f8d40fMadeleine Thompson4 years ago172return result.content
7ddcba1aRachel Lim5 years ago173
174@classmethod
0abf6413Andrew Chen Wang3 years ago175async def adownload(
7ddcba1aRachel Lim5 years ago176cls,
0abf6413Andrew Chen Wang3 years ago177id,
7ddcba1aRachel Lim5 years ago178api_key=None,
179api_base=None,
02e4008dSorin Suciu4 years ago180api_type=None,
7ddcba1aRachel Lim5 years ago181api_version=None,
182organization=None,
183):
0abf6413Andrew Chen Wang3 years ago184requestor, url = cls.__prepare_file_download(
185id, api_key, api_base, api_type, api_version, organization
186)
187
7af43ce0Damien Deville3 years ago188async with api_requestor.aiohttp_session() as session:
189result = await requestor.arequest_raw("get", url, session)
190if not 200 <= result.status < 300:
191raise requestor.handle_error_response(
192result.content,
193result.status,
194json.loads(cast(bytes, result.content)),
195result.headers,
196stream_error=False,
197)
198return result.content
0abf6413Andrew Chen Wang3 years ago199
200@classmethod
201def __find_matching_files(cls, name, all_files, purpose):
7ddcba1aRachel Lim5 years ago202matching_files = []
f4f6f90cRachel Lim4 years ago203basename = os.path.basename(name)
7ddcba1aRachel Lim5 years ago204for f in all_files:
205if f["purpose"] != purpose:
206continue
f4f6f90cRachel Lim4 years ago207file_basename = os.path.basename(f["filename"])
208if file_basename != basename:
7ddcba1aRachel Lim5 years ago209continue
02e4008dSorin Suciu4 years ago210if "bytes" in f and f["bytes"] != bytes:
211continue
212if "size" in f and int(f["size"]) != bytes:
7ddcba1aRachel Lim5 years ago213continue
214matching_files.append(f)
215return matching_files
0abf6413Andrew Chen Wang3 years ago216
217@classmethod
218def find_matching_files(
219cls,
220name,
221bytes,
222purpose,
223api_key=None,
224api_base=None,
225api_type=None,
226api_version=None,
227organization=None,
228):
229"""Find already uploaded files with the same name, size, and purpose."""
230all_files = cls.list(
231api_key=api_key,
232api_base=api_base or openai.api_base,
233api_type=api_type,
234api_version=api_version,
235organization=organization,
236).get("data", [])
237return cls.__find_matching_files(name, all_files, purpose)
238
239@classmethod
240async def afind_matching_files(
241cls,
242name,
243bytes,
244purpose,
245api_key=None,
246api_base=None,
247api_type=None,
248api_version=None,
249organization=None,
250):
251"""Find already uploaded files with the same name, size, and purpose."""
252all_files = (
253await cls.alist(
254api_key=api_key,
255api_base=api_base or openai.api_base,
256api_type=api_type,
257api_version=api_version,
258organization=organization,
259)
260).get("data", [])
261return cls.__find_matching_files(name, all_files, purpose)