Skip to content

Commit c83fb9f

Browse files
authored
Make document upload method flexible (#238)
1 parent 2921079 commit c83fb9f

File tree

7 files changed

+37
-25
lines changed

7 files changed

+37
-25
lines changed

ragna/core/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"Component",
55
"Document",
66
"DocumentHandler",
7+
"DocumentUploadParameters",
78
"EnvVarRequirement",
89
"LocalDocument",
910
"Message",
@@ -31,6 +32,7 @@
3132
from ._document import (
3233
Document,
3334
DocumentHandler,
35+
DocumentUploadParameters,
3436
LocalDocument,
3537
Page,
3638
PdfDocumentHandler,

ragna/core/_document.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
from ragna.deploy import Config
1818

1919

20+
class DocumentUploadParameters(BaseModel):
21+
method: str
22+
url: str
23+
data: dict
24+
25+
2026
class Document(RequirementsMixin, abc.ABC):
2127
"""Abstract base class for all documents."""
2228

@@ -59,7 +65,7 @@ def get_handler(name: str) -> DocumentHandler:
5965
@abc.abstractmethod
6066
async def get_upload_info(
6167
cls, *, config: Config, user: str, id: uuid.UUID, name: str
62-
) -> tuple[str, dict[str, Any], dict[str, Any]]:
68+
) -> tuple[dict[str, Any], DocumentUploadParameters]:
6369
pass
6470

6571
@abc.abstractmethod
@@ -136,7 +142,7 @@ def read(self) -> bytes:
136142
@classmethod
137143
async def get_upload_info(
138144
cls, *, config: Config, user: str, id: uuid.UUID, name: str
139-
) -> tuple[str, dict[str, Any], dict[str, Any]]:
145+
) -> tuple[dict[str, Any], DocumentUploadParameters]:
140146
url = f"{config.api.url}/document"
141147
data = {
142148
"token": jwt.encode(
@@ -150,7 +156,7 @@ async def get_upload_info(
150156
)
151157
}
152158
metadata = {"path": str(config.local_cache_root / "documents" / str(id))}
153-
return url, data, metadata
159+
return metadata, DocumentUploadParameters(method="PUT", url=url, data=data)
154160

155161
@classmethod
156162
def decode_upload_token(cls, token: str) -> tuple[str, uuid.UUID]:

ragna/deploy/_api/core.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,16 @@ def get_session() -> Iterator[database.Session]:
116116
async def create_document_upload_info(
117117
user: UserDependency,
118118
name: Annotated[str, Body(..., embed=True)],
119-
) -> schemas.DocumentUploadInfo:
119+
) -> schemas.DocumentUpload:
120120
with get_session() as session:
121121
document = schemas.Document(name=name)
122-
url, data, metadata = await config.document.get_upload_info(
122+
metadata, parameters = await config.document.get_upload_info(
123123
config=config, user=user, id=document.id, name=document.name
124124
)
125125
database.add_document(
126126
session, user=user, document=document, metadata=metadata
127127
)
128-
return schemas.DocumentUploadInfo(url=url, data=data, document=document)
128+
return schemas.DocumentUpload(parameters=parameters, document=document)
129129

130130
@app.put("/document")
131131
async def upload_document(

ragna/deploy/_api/schemas.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ def from_core(cls, document: ragna.core.Document) -> Document:
2727
)
2828

2929

30-
class DocumentUploadInfo(BaseModel):
31-
url: str
32-
data: dict
30+
class DocumentUpload(BaseModel):
31+
parameters: ragna.core.DocumentUploadParameters
3332
document: Document
3433

3534

ragna/deploy/_ui/resources/upload.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ async function uploadFile(file, token, informationEndpoint) {
1212
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
1313
body: JSON.stringify({ name: file.name }),
1414
});
15-
const documentInfo = await response.json();
15+
const documentUpload = await response.json();
1616

17+
const parameters = documentUpload.parameters;
1718
var body = new FormData();
18-
for (const [key, value] of Object.entries(documentInfo.data)) {
19+
for (const [key, value] of Object.entries(parameters.data)) {
1920
body.append(key, value);
2021
}
2122
body.append("file", file);
2223

23-
await fetch(documentInfo.url, {
24-
method: "PUT",
24+
await fetch(parameters.url, {
25+
method: parameters.method,
2526
body: body,
2627
});
2728

28-
return documentInfo.document;
29+
return documentUpload.document;
2930
}

scripts/add_chats.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ def main():
3434
documents = []
3535
for i in range(5):
3636
name = f"document{i}.txt"
37-
document_info = (
37+
document_upload = (
3838
client.post("/document", json={"name": name}).raise_for_status().json()
3939
)
40-
client.put(
41-
document_info["url"],
42-
data=document_info["data"],
40+
parameters = document_upload["parameters"]
41+
client.request(
42+
parameters["method"],
43+
parameters["url"],
44+
data=parameters["data"],
4345
files={"file": f"Content of {name}".encode()},
4446
).raise_for_status()
45-
documents.append(document_info["document"])
47+
documents.append(document_upload["document"])
4648

4749
## chat 1
4850

tests/deploy/api/test_e2e.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,22 @@ def check_api(config):
4949

5050
assert client.get("/chats").raise_for_status().json() == []
5151

52-
document_info = (
52+
document_upload = (
5353
client.post("/document", json={"name": document_path.name})
5454
.raise_for_status()
5555
.json()
5656
)
57-
document = document_info["document"]
57+
document = document_upload["document"]
5858
assert document["name"] == document_path.name
5959

60+
parameters = document_upload["parameters"]
6061
with open(document_path, "rb") as file:
61-
client.put(
62-
document_info["url"],
63-
data=document_info["data"],
62+
client.request(
63+
parameters["method"],
64+
parameters["url"],
65+
data=parameters["data"],
6466
files={"file": file},
65-
).raise_for_status()
67+
)
6668

6769
components = client.get("/components").raise_for_status().json()
6870
documents = components["documents"]

0 commit comments

Comments
 (0)