Skip to content

Commit 50c2df5

Browse files
Cleanup and minor bugfixes in file endpoints
1 parent 2b91ebb commit 50c2df5

File tree

2 files changed

+44
-49
lines changed

2 files changed

+44
-49
lines changed

routers/files.py

Lines changed: 37 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import os
22
import logging
33
from dotenv import load_dotenv
4-
from fastapi import APIRouter, Request, UploadFile, File, HTTPException, Depends
4+
from fastapi import APIRouter, Request, UploadFile, File, HTTPException, Depends, Form
55
from fastapi.responses import StreamingResponse
6-
from pydantic import BaseModel
76
from openai import AsyncOpenAI
87

98
logger = logging.getLogger("uvicorn.error")
@@ -17,21 +16,13 @@
1716
tags=["assistants_files"]
1817
)
1918

20-
# Pydantic model for DELETE request body
21-
class DeleteRequest(BaseModel):
22-
fileId: str
23-
24-
# Pydantic model for request parameters
25-
class FileParams(BaseModel):
26-
file_id: str
27-
2819
# Helper function to get or create a vector store
2920
async def get_or_create_vector_store(assistantId: str, client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())) -> str:
3021
assistant = await client.beta.assistants.retrieve(assistantId)
3122
if assistant.tool_resources and assistant.tool_resources.file_search and assistant.tool_resources.file_search.vector_store_ids:
3223
return assistant.tool_resources.file_search.vector_store_ids[0]
3324

34-
vector_store = await client.beta.vectorStores.create(name="sample-assistant-vector-store")
25+
vector_store = await client.beta.vector_stores.create(name="sample-assistant-vector-store")
3526
await client.beta.assistants.update(assistantId, {
3627
"tool_resources": {
3728
"file_search": {
@@ -42,24 +33,26 @@ async def get_or_create_vector_store(assistantId: str, client: AsyncOpenAI = Dep
4233
return vector_store.id
4334

4435

45-
@router.get("/files/{file_id}")
46-
async def get_file(file_id: str):
47-
try:
48-
# Retrieve file metadata and content concurrently
49-
client = AsyncOpenAI()
50-
file, file_content = await client.files.retrieve(file_id), await client.files.content(file_id)
51-
52-
# Return the file content as a streaming response
53-
return StreamingResponse(
54-
file_content.body,
55-
headers={"Content-Disposition": f'attachment; filename="{file.filename}"'}
56-
)
57-
except Exception as e:
58-
# Handle exceptions and return an HTTP error response
59-
raise HTTPException(status_code=500, detail=str(e))
36+
@router.get("/")
37+
async def list_files(client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())):
38+
# List files in the vector store
39+
vector_store_id = await get_or_create_vector_store(assistant_id, client)
40+
file_list = await client.beta.vectorStores.files.list(vector_store_id)
41+
42+
files_array = []
43+
for file in file_list.data:
44+
file_details = await client.files.retrieve(file.id)
45+
vector_file_details = await client.beta.vectorStores.files.retrieve(vector_store_id, file.id)
46+
files_array.append({
47+
"file_id": file.id,
48+
"filename": file_details.filename,
49+
"status": vector_file_details.status,
50+
})
51+
52+
return files_array
6053

6154

62-
@router.post("/upload")
55+
@router.post("/")
6356
async def upload_file(file: UploadFile = File(...)):
6457
try:
6558
client = AsyncOpenAI()
@@ -81,29 +74,25 @@ async def upload_file(file: UploadFile = File(...)):
8174
raise HTTPException(status_code=500, detail=str(e))
8275

8376

84-
@router.get("")
85-
async def list_files(client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())):
86-
# List files in the vector store
87-
vector_store_id = await get_or_create_vector_store(assistant_id, client)
88-
file_list = await client.beta.vectorStores.files.list(vector_store_id)
89-
90-
files_array = []
91-
for file in file_list.data:
92-
file_details = await client.files.retrieve(file.id)
93-
vector_file_details = await client.beta.vectorStores.files.retrieve(vector_store_id, file.id)
94-
files_array.append({
95-
"file_id": file.id,
96-
"filename": file_details.filename,
97-
"status": vector_file_details.status,
98-
})
99-
100-
return files_array
77+
@router.get("/{file_id}")
78+
async def get_file(file_id: str = Form(...), client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())):
79+
try:
80+
# Retrieve file metadata and content concurrently
81+
file, file_content = await client.files.retrieve(file_id), await client.files.content(file_id)
82+
83+
# Return the file content as a streaming response
84+
return StreamingResponse(
85+
file_content.body,
86+
headers={"Content-Disposition": f'attachment; filename="{file.filename}"'}
87+
)
88+
except Exception as e:
89+
# Handle exceptions and return an HTTP error response
90+
raise HTTPException(status_code=500, detail=str(e))
91+
10192

10293
@router.delete("/delete")
103-
async def delete_file(request: Request, client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())):
94+
async def delete_file(request: Request, fileId: str = Form(...), client: AsyncOpenAI = Depends(lambda: AsyncOpenAI())):
10495
# Delete file from vector store
105-
body = await request.json()
106-
delete_request = DeleteRequest(**body)
10796
vector_store_id = await get_or_create_vector_store(assistant_id, client)
108-
await client.beta.vectorStores.files.delete(vector_store_id, delete_request.fileId)
97+
await client.beta.vectorStores.files.delete(vector_store_id, fileId)
10998
return {"message": "File deleted successfully"}

utils/create_assistant.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from openai.types.beta.assistant_tool_param import CodeInterpreterToolParam, FileSearchToolParam, FunctionToolParam
88
from openai.types.beta.assistant import Assistant
99
from openai.types import FunctionDefinition
10+
from openai.types.beta.file_search_tool_param import FileSearch
1011

1112

1213
request: AssistantCreateParams = AssistantCreateParams(
@@ -15,7 +16,12 @@
1516
model="gpt-4o",
1617
tools=[
1718
CodeInterpreterToolParam(type="code_interpreter"),
18-
FileSearchToolParam(type="file_search"),
19+
FileSearchToolParam(
20+
type="file_search",
21+
file_search=FileSearch(
22+
max_num_results=5
23+
)
24+
),
1925
FunctionToolParam(
2026
type="function",
2127
function=FunctionDefinition(

0 commit comments

Comments
 (0)