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.
@@ -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
- url = f"{unique_sdk.api_base}/content/{content_id}/file"
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.35
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=YClD-johtUe8rjeWgsUo-HUGgNEBhk_74Go1iMJ2oak,14282
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.35.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
44
- unique_toolkit-0.5.35.dist-info/METADATA,sha256=2FdoeyNYUy50Szp_YldFsdkaqluyWwC6cuqIn8kS5Tg,13444
45
- unique_toolkit-0.5.35.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
46
- unique_toolkit-0.5.35.dist-info/RECORD,,
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,,