unique_toolkit 0.5.35__py3-none-any.whl → 0.5.36__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- unique_toolkit/content/service.py +84 -16
- {unique_toolkit-0.5.35.dist-info → unique_toolkit-0.5.36.dist-info}/METADATA +5 -1
- {unique_toolkit-0.5.35.dist-info → unique_toolkit-0.5.36.dist-info}/RECORD +5 -5
- {unique_toolkit-0.5.35.dist-info → unique_toolkit-0.5.36.dist-info}/LICENSE +0 -0
- {unique_toolkit-0.5.35.dist-info → unique_toolkit-0.5.36.dist-info}/WHEEL +0 -0
@@ -1,5 +1,6 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
+
import re
|
3
4
|
import tempfile
|
4
5
|
from pathlib import Path
|
5
6
|
from typing import Optional, Union, cast
|
@@ -350,6 +351,88 @@ class ContentService(BaseService):
|
|
350
351
|
|
351
352
|
return Content(**created_content)
|
352
353
|
|
354
|
+
def request_content_by_id(
|
355
|
+
self, content_id: str, chat_id: str | None
|
356
|
+
) -> requests.Response:
|
357
|
+
"""
|
358
|
+
Sends a request to download content from a chat.
|
359
|
+
|
360
|
+
Args:
|
361
|
+
content_id (str): The ID of the content to download.
|
362
|
+
chat_id (str): The ID of the chat from which to download the content. Defaults to None to download from knowledge base.
|
363
|
+
|
364
|
+
Returns:
|
365
|
+
requests.Response: The response object containing the downloaded content.
|
366
|
+
|
367
|
+
"""
|
368
|
+
url = f"{unique_sdk.api_base}/content/{content_id}/file"
|
369
|
+
if chat_id:
|
370
|
+
url = f"{url}?chatId={chat_id}"
|
371
|
+
|
372
|
+
# Download the file and save it to the random directory
|
373
|
+
headers = {
|
374
|
+
"x-api-version": unique_sdk.api_version,
|
375
|
+
"x-app-id": unique_sdk.app_id,
|
376
|
+
"x-user-id": self.event.user_id,
|
377
|
+
"x-company-id": self.event.company_id,
|
378
|
+
"Authorization": "Bearer %s" % (unique_sdk.api_key,),
|
379
|
+
}
|
380
|
+
|
381
|
+
return requests.get(url, headers=headers)
|
382
|
+
|
383
|
+
def download_content_to_file_by_id(
|
384
|
+
self,
|
385
|
+
content_id: str,
|
386
|
+
chat_id: Optional[str] = None,
|
387
|
+
filename: str | None = None,
|
388
|
+
tmp_dir_path: Optional[Union[str, Path]] = "/tmp",
|
389
|
+
):
|
390
|
+
"""
|
391
|
+
Downloads content from a chat and saves it to a file.
|
392
|
+
|
393
|
+
Args:
|
394
|
+
content_id (str): The ID of the content to download.
|
395
|
+
chat_id (Optional[str]): The ID of the chat to download from. Defaults to None and the file is downloaded from the knowledge base.
|
396
|
+
filename (str | None): The name of the file to save the content as. If not provided, the original filename will be used. Defaults to None.
|
397
|
+
tmp_dir_path (Optional[Union[str, Path]]): The path to the temporary directory where the content will be saved. Defaults to "/tmp".
|
398
|
+
|
399
|
+
Returns:
|
400
|
+
Path: The path to the downloaded file.
|
401
|
+
|
402
|
+
Raises:
|
403
|
+
Exception: If the download fails or the filename cannot be determined.
|
404
|
+
"""
|
405
|
+
|
406
|
+
response = self.request_content_by_id(content_id, chat_id)
|
407
|
+
random_dir = tempfile.mkdtemp(dir=tmp_dir_path)
|
408
|
+
|
409
|
+
if response.status_code == 200:
|
410
|
+
if filename:
|
411
|
+
content_path = Path(random_dir) / filename
|
412
|
+
else:
|
413
|
+
pattern = r'filename="([^"]+)"'
|
414
|
+
match = re.search(
|
415
|
+
pattern, response.headers.get("Content-Disposition", "")
|
416
|
+
)
|
417
|
+
if match:
|
418
|
+
content_path = Path(random_dir) / match.group(1)
|
419
|
+
else:
|
420
|
+
error_msg = (
|
421
|
+
"Error downloading file: Filename could not be determined"
|
422
|
+
)
|
423
|
+
self.logger.error(error_msg)
|
424
|
+
raise Exception(error_msg)
|
425
|
+
|
426
|
+
with open(content_path, "wb") as file:
|
427
|
+
file.write(response.content)
|
428
|
+
else:
|
429
|
+
error_msg = f"Error downloading file: Status code {response.status_code}"
|
430
|
+
self.logger.error(error_msg)
|
431
|
+
raise Exception(error_msg)
|
432
|
+
|
433
|
+
return content_path
|
434
|
+
|
435
|
+
# TODO: Discuss if we should deprecate this method due to unclear use by content_name
|
353
436
|
def download_content(
|
354
437
|
self,
|
355
438
|
content_id: str,
|
@@ -373,26 +456,11 @@ class ContentService(BaseService):
|
|
373
456
|
Exception: If the download fails.
|
374
457
|
"""
|
375
458
|
|
376
|
-
|
377
|
-
if chat_id:
|
378
|
-
url = f"{url}?chatId={chat_id}"
|
459
|
+
response = self.request_content_by_id(content_id, chat_id)
|
379
460
|
|
380
|
-
# Create a random directory inside /tmp
|
381
461
|
random_dir = tempfile.mkdtemp(dir=dir_path)
|
382
|
-
|
383
|
-
# Create the full file path
|
384
462
|
content_path = Path(random_dir) / content_name
|
385
463
|
|
386
|
-
# Download the file and save it to the random directory
|
387
|
-
headers = {
|
388
|
-
"x-api-version": unique_sdk.api_version,
|
389
|
-
"x-app-id": unique_sdk.app_id,
|
390
|
-
"x-user-id": self.event.user_id,
|
391
|
-
"x-company-id": self.event.company_id,
|
392
|
-
"Authorization": "Bearer %s" % (unique_sdk.api_key,),
|
393
|
-
}
|
394
|
-
|
395
|
-
response = requests.get(url, headers=headers)
|
396
464
|
if response.status_code == 200:
|
397
465
|
with open(content_path, "wb") as file:
|
398
466
|
file.write(response.content)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: unique_toolkit
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.36
|
4
4
|
Summary:
|
5
5
|
License: Proprietary
|
6
6
|
Author: Martin Fadler
|
@@ -100,6 +100,10 @@ All notable changes to this project will be documented in this file.
|
|
100
100
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
101
101
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
102
102
|
|
103
|
+
## [0.5.36] - 2024-11-19
|
104
|
+
- Add possibility to return the response from the download file from chat request
|
105
|
+
- Add possibility to not specify a filename and use filename from response headers
|
106
|
+
|
103
107
|
## [0.5.35] - 2024-11-18
|
104
108
|
- Add the possibilty to upload files without triggering ingestion by setting `skip_ingestion` to `True` in `ContentService.upload_content`
|
105
109
|
|
@@ -17,7 +17,7 @@ unique_toolkit/chat/state.py,sha256=Cjgwv_2vhDFbV69xxsn7SefhaoIAEqLx3ferdVFCnOg,
|
|
17
17
|
unique_toolkit/chat/utils.py,sha256=ihm-wQykBWhB4liR3LnwPVPt_qGW6ETq21Mw4HY0THE,854
|
18
18
|
unique_toolkit/content/__init__.py,sha256=MSH2sxjQyKD2Sef92fzE5Dt9SihdzivB6yliSwJfTmQ,890
|
19
19
|
unique_toolkit/content/schemas.py,sha256=zks_Pkki2VhxICJJgHZyc-LPmRuj5dLbw3pgcUT7SW8,2362
|
20
|
-
unique_toolkit/content/service.py,sha256=
|
20
|
+
unique_toolkit/content/service.py,sha256=e23GX2pzIppHCFPUHng-82pSELT8JKT4TRMCO6M2Lok,16968
|
21
21
|
unique_toolkit/content/utils.py,sha256=Lake671plRsqNvO3pN_rmyVcpwbdED_KQpLcCnc4lv4,6902
|
22
22
|
unique_toolkit/embedding/__init__.py,sha256=dr8M9jvslQTxPpxgaGwzxY0FildiWf-DidN_cahPAWw,191
|
23
23
|
unique_toolkit/embedding/schemas.py,sha256=1GvKCaSk4jixzVQ2PKq8yDqwGEVY_hWclYtoAr6CC2g,96
|
@@ -40,7 +40,7 @@ unique_toolkit/language_model/infos.py,sha256=kQK6F3r8xTN7oT6b39J7rxW-Y4iPXjx_Fr
|
|
40
40
|
unique_toolkit/language_model/schemas.py,sha256=0pMLM1cCplw1OlM-eLqldZtYMObGr7tjHKXSHQP7hwE,6216
|
41
41
|
unique_toolkit/language_model/service.py,sha256=s5X6EStyYumiYqlD9gkW4GANif18d9QZOMysmUSfv8M,13433
|
42
42
|
unique_toolkit/language_model/utils.py,sha256=WBPj1XKkDgxy_-T8HCZvsfkkSzj_1w4UZzNmyvdbBLY,1081
|
43
|
-
unique_toolkit-0.5.
|
44
|
-
unique_toolkit-0.5.
|
45
|
-
unique_toolkit-0.5.
|
46
|
-
unique_toolkit-0.5.
|
43
|
+
unique_toolkit-0.5.36.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
|
44
|
+
unique_toolkit-0.5.36.dist-info/METADATA,sha256=4YTkAbPH4uPA3IxsLyxr4-eI3wvn8LLJTAxhO-UDNTw,13635
|
45
|
+
unique_toolkit-0.5.36.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
46
|
+
unique_toolkit-0.5.36.dist-info/RECORD,,
|
File without changes
|
File without changes
|