consolidate ResourceNotFoundError sites, fix plurality

This commit is contained in:
Matthew Farrellee 2025-08-20 07:56:16 -04:00
parent 639e3f4570
commit 3fceb28a39

View file

@ -66,6 +66,18 @@ class LocalfsFilesImpl(Files):
"""Get the filesystem path for a file ID.""" """Get the filesystem path for a file ID."""
return Path(self.config.storage_dir) / file_id return Path(self.config.storage_dir) / file_id
async def _lookup_file_id(self, file_id: str) -> tuple[OpenAIFileObject, Path]:
"""Look up a OpenAIFileObject and filesystem path from its ID."""
if not self.sql_store:
raise RuntimeError("Files provider not initialized")
row = await self.sql_store.fetch_one("openai_files", policy=self.policy, where={"id": file_id})
if not row:
raise ResourceNotFoundError(file_id, "File", "client.files.list()")
file_path = Path(row.pop("file_path"))
return OpenAIFileObject(**row), file_path
# OpenAI Files API Implementation # OpenAI Files API Implementation
async def openai_upload_file( async def openai_upload_file(
self, self,
@ -158,37 +170,19 @@ class LocalfsFilesImpl(Files):
async def openai_retrieve_file(self, file_id: str) -> OpenAIFileObject: async def openai_retrieve_file(self, file_id: str) -> OpenAIFileObject:
"""Returns information about a specific file.""" """Returns information about a specific file."""
if not self.sql_store: file_obj, _ = await self._lookup_file_id(file_id)
raise RuntimeError("Files provider not initialized")
row = await self.sql_store.fetch_one("openai_files", policy=self.policy, where={"id": file_id}) return file_obj
if not row:
raise ResourceNotFoundError(file_id, "files", "files.list()")
return OpenAIFileObject(
id=row["id"],
filename=row["filename"],
purpose=OpenAIFilePurpose(row["purpose"]),
bytes=row["bytes"],
created_at=row["created_at"],
expires_at=row["expires_at"],
)
async def openai_delete_file(self, file_id: str) -> OpenAIFileDeleteResponse: async def openai_delete_file(self, file_id: str) -> OpenAIFileDeleteResponse:
"""Delete a file.""" """Delete a file."""
if not self.sql_store:
raise RuntimeError("Files provider not initialized")
row = await self.sql_store.fetch_one("openai_files", policy=self.policy, where={"id": file_id})
if not row:
raise ResourceNotFoundError(file_id, "files", "files.list()")
# Delete physical file # Delete physical file
file_path = Path(row["file_path"]) _, file_path = await self._lookup_file_id(file_id)
if file_path.exists(): if file_path.exists():
file_path.unlink() file_path.unlink()
# Delete metadata from database # Delete metadata from database
assert self.sql_store is not None, "Files provider not initialized"
await self.sql_store.delete("openai_files", where={"id": file_id}) await self.sql_store.delete("openai_files", where={"id": file_id})
return OpenAIFileDeleteResponse( return OpenAIFileDeleteResponse(
@ -198,25 +192,15 @@ class LocalfsFilesImpl(Files):
async def openai_retrieve_file_content(self, file_id: str) -> Response: async def openai_retrieve_file_content(self, file_id: str) -> Response:
"""Returns the contents of the specified file.""" """Returns the contents of the specified file."""
if not self.sql_store:
raise RuntimeError("Files provider not initialized")
# Get file metadata
row = await self.sql_store.fetch_one("openai_files", policy=self.policy, where={"id": file_id})
if not row:
raise ResourceNotFoundError(file_id, "files", "files.list()")
# Read file content # Read file content
file_path = Path(row["file_path"]) file_obj, file_path = await self._lookup_file_id(file_id)
if not file_path.exists():
raise ResourceNotFoundError(file_id, "files content", "files.list()")
with open(file_path, "rb") as f: with open(file_path, "rb") as f: # this may fail and result in 500 Internal Server Error
content = f.read() content = f.read()
# Return as binary response with appropriate content type # Return as binary response with appropriate content type
return Response( return Response(
content=content, content=content,
media_type="application/octet-stream", media_type="application/octet-stream",
headers={"Content-Disposition": f'attachment; filename="{row["filename"]}"'}, headers={"Content-Disposition": f'attachment; filename="{file_obj.filename}"'},
) )