diff --git a/api/apps/document_app.py b/api/apps/document_app.py index c5b1aea33d..cc2b7c8c4a 100644 --- a/api/apps/document_app.py +++ b/api/apps/document_app.py @@ -705,7 +705,7 @@ async def rename(): @manager.route("/get/", methods=["GET"]) # noqa: F821 -# @login_required +@login_required async def get(doc_id): try: e, doc = DocumentService.get_by_id(doc_id) diff --git a/api/apps/sdk/doc.py b/api/apps/sdk/doc.py index d8b81dce7e..16f5a2e8d2 100644 --- a/api/apps/sdk/doc.py +++ b/api/apps/sdk/doc.py @@ -27,7 +27,7 @@ from pydantic import BaseModel, Field, validator from api.constants import FILE_NAME_LEN_LIMIT from api.db import FileType -from api.db.db_models import File, Task +from api.db.db_models import APIToken, File, Task from api.db.services.document_service import DocumentService from api.db.services.doc_metadata_service import DocMetadataService from api.db.services.file2document_service import File2DocumentService @@ -419,6 +419,36 @@ async def download(tenant_id, dataset_id, document_id): ) +@manager.route("/documents/", methods=["GET"]) # noqa: F821 +async def download_doc(document_id): + token = request.headers.get("Authorization").split() + if len(token) != 2: + return get_error_data_result(message='Authorization is not valid!"') + token = token[1] + objs = APIToken.query(beta=token) + if not objs: + return get_error_data_result(message='Authentication error: API key is invalid!"') + + if not document_id: + return get_error_data_result(message="Specify document_id please.") + doc = DocumentService.query(id=document_id) + if not doc: + return get_error_data_result(message=f"The dataset not own the document {document_id}.") + # The process of downloading + doc_id, doc_location = File2DocumentService.get_storage_address(doc_id=document_id) # minio address + file_stream = settings.STORAGE_IMPL.get(doc_id, doc_location) + if not file_stream: + return construct_json_result(message="This file is empty.", code=RetCode.DATA_ERROR) + file = BytesIO(file_stream) + # Use send_file with a proper filename and MIME type + return await send_file( + file, + as_attachment=True, + attachment_filename=doc[0].name, + mimetype="application/octet-stream", # Set a default MIME type + ) + + @manager.route("/datasets//documents", methods=["GET"]) # noqa: F821 @token_required def list_docs(dataset_id, tenant_id): diff --git a/api/db/services/canvas_service.py b/api/db/services/canvas_service.py index 6cd68e52a0..ee0710a09d 100644 --- a/api/db/services/canvas_service.py +++ b/api/db/services/canvas_service.py @@ -229,7 +229,8 @@ async def completion(tenant_id, agent_id, session_id=None, **kwargs): conv.message.append({ "role": "user", "content": query, - "id": message_id + "id": message_id, + "files": files }) txt = "" async for ans in canvas.run(query=query, files=files, user_id=user_id, inputs=inputs):