openrag/src/api/upload.py

68 lines
2.4 KiB
Python

import os
from starlette.requests import Request
from starlette.responses import JSONResponse
async def upload(request: Request, document_service, session_manager):
"""Upload a single file"""
form = await request.form()
upload_file = form["file"]
user = request.state.user
result = await document_service.process_upload_file(upload_file, owner_user_id=user.user_id)
return JSONResponse(result)
async def upload_path(request: Request, task_service, session_manager):
"""Upload all files from a directory path"""
payload = await request.json()
base_dir = payload.get("path")
if not base_dir or not os.path.isdir(base_dir):
return JSONResponse({"error": "Invalid path"}, status_code=400)
file_paths = [os.path.join(root, fn)
for root, _, files in os.walk(base_dir)
for fn in files]
if not file_paths:
return JSONResponse({"error": "No files found in directory"}, status_code=400)
user = request.state.user
task_id = await task_service.create_upload_task(user.user_id, file_paths)
return JSONResponse({
"task_id": task_id,
"total_files": len(file_paths),
"status": "accepted"
}, status_code=201)
async def upload_context(request: Request, document_service, chat_service, session_manager):
"""Upload a file and add its content as context to the current conversation"""
form = await request.form()
upload_file = form["file"]
filename = upload_file.filename or "uploaded_document"
# Get optional parameters
previous_response_id = form.get("previous_response_id")
endpoint = form.get("endpoint", "langflow")
# Process document and extract content
doc_result = await document_service.process_upload_context(upload_file, filename)
# Send document content as user message to get proper response_id
response_text, response_id = await chat_service.upload_context_chat(
doc_result["content"],
filename,
previous_response_id=previous_response_id,
endpoint=endpoint
)
response_data = {
"status": "context_added",
"filename": doc_result["filename"],
"pages": doc_result["pages"],
"content_length": doc_result["content_length"],
"response_id": response_id,
"confirmation": response_text
}
return JSONResponse(response_data)