seekrai 0.5.0__tar.gz → 0.5.1__tar.gz

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.
Files changed (66) hide show
  1. {seekrai-0.5.0 → seekrai-0.5.1}/PKG-INFO +1 -1
  2. {seekrai-0.5.0 → seekrai-0.5.1}/pyproject.toml +1 -1
  3. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/chat/completions.py +1 -1
  4. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/files.py +150 -18
  5. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/files.py +1 -2
  6. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/vectordb.py +2 -0
  7. {seekrai-0.5.0 → seekrai-0.5.1}/LICENSE +0 -0
  8. {seekrai-0.5.0 → seekrai-0.5.1}/README.md +0 -0
  9. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/__init__.py +0 -0
  10. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/abstract/__init__.py +0 -0
  11. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/abstract/api_requestor.py +0 -0
  12. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/abstract/response_parsing.py +0 -0
  13. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/client.py +0 -0
  14. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/constants.py +0 -0
  15. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/error.py +0 -0
  16. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/filemanager.py +0 -0
  17. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/__init__.py +0 -0
  18. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/agents/__init__.py +0 -0
  19. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/agents/agent_inference.py +0 -0
  20. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/agents/agents.py +0 -0
  21. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/agents/threads.py +0 -0
  22. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/alignment.py +0 -0
  23. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/chat/__init__.py +0 -0
  24. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/completions.py +0 -0
  25. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/deployments.py +0 -0
  26. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/embeddings.py +0 -0
  27. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/finetune.py +0 -0
  28. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/images.py +0 -0
  29. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/ingestion.py +0 -0
  30. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/models.py +0 -0
  31. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/projects.py +0 -0
  32. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/resource_base.py +0 -0
  33. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/resources/vectordb.py +0 -0
  34. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/seekrflow_response.py +0 -0
  35. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/__init__.py +0 -0
  36. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/abstract.py +0 -0
  37. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/__init__.py +0 -0
  38. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/agent.py +0 -0
  39. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/runs.py +0 -0
  40. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/threads.py +0 -0
  41. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/__init__.py +0 -0
  42. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/env_model_config.py +0 -0
  43. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/schemas/__init__.py +0 -0
  44. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/schemas/file_search.py +0 -0
  45. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/schemas/file_search_env.py +0 -0
  46. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/tool.py +0 -0
  47. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/tool_env_types.py +0 -0
  48. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/agents/tools/tool_types.py +0 -0
  49. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/alignment.py +0 -0
  50. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/chat_completions.py +0 -0
  51. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/common.py +0 -0
  52. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/completions.py +0 -0
  53. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/deployments.py +0 -0
  54. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/embeddings.py +0 -0
  55. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/error.py +0 -0
  56. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/finetune.py +0 -0
  57. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/images.py +0 -0
  58. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/ingestion.py +0 -0
  59. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/models.py +0 -0
  60. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/types/projects.py +0 -0
  61. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/utils/__init__.py +0 -0
  62. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/utils/_log.py +0 -0
  63. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/utils/api_helpers.py +0 -0
  64. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/utils/files.py +0 -0
  65. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/utils/tools.py +0 -0
  66. {seekrai-0.5.0 → seekrai-0.5.1}/src/seekrai/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: seekrai
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Python client for SeekrAI
5
5
  License: Apache-2.0
6
6
  Author: SeekrFlow
@@ -14,7 +14,7 @@ build-backend = "poetry.core.masonry.api"
14
14
 
15
15
  [tool.poetry]
16
16
  name = "seekrai"
17
- version = "0.5.0"
17
+ version = "0.5.1"
18
18
  authors = [
19
19
  "SeekrFlow <support@seekr.com>"
20
20
  ]
@@ -147,7 +147,7 @@ class AsyncChatCompletions:
147
147
  repetition_penalty: float = 1,
148
148
  stream: bool = False,
149
149
  logprobs: bool | None = False,
150
- top_logprobs: int | None = 0,
150
+ top_logprobs: int | None = None,
151
151
  echo: bool = False,
152
152
  n: int = 1,
153
153
  safety_model: str | None = None,
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import Any, Dict
4
+ from typing import Any, Dict, Optional, Union
5
5
 
6
6
  from seekrai.abstract import api_requestor
7
7
  from seekrai.filemanager import DownloadManager, UploadManager
@@ -197,30 +197,92 @@ class Files(ResourceBase):
197
197
 
198
198
  return AlignFileMetadataValidationResp(**response.data)
199
199
 
200
- def list(self) -> FileList:
200
+ def list(
201
+ self,
202
+ limit: Optional[int] = None,
203
+ offset: Optional[int] = None,
204
+ sort_by: Optional[str] = None,
205
+ sort_order: Optional[str] = None,
206
+ purpose: Optional[Union[FilePurpose, str]] = None,
207
+ ) -> FileList:
208
+ """
209
+ List files with pagination, sorting, and filtering options.
210
+
211
+ All parameter defaults are handled by the API if not specified.
212
+
213
+ Args:
214
+ limit: Maximum number of files to return
215
+ offset: Number of files to skip
216
+ sort_by: Field to sort by ('created_at', 'filename', 'type', or 'size')
217
+ sort_order: Sort order ('asc' or 'desc')
218
+ purpose: Filter by file purpose (FilePurpose enum or string)
219
+
220
+ Returns:
221
+ A FileList object containing the list of files
222
+
223
+ Raises:
224
+ Exception: If the API request fails
225
+ """
226
+ # Build query parameters, only including non-None values
227
+ params: Dict[str, Any] = {}
228
+ if limit is not None:
229
+ params["limit"] = limit
230
+ if offset is not None:
231
+ params["offset"] = offset
232
+ if sort_by is not None:
233
+ params["sort_by"] = sort_by
234
+ if sort_order is not None:
235
+ params["sort_order"] = sort_order
236
+
237
+ # Add purpose filter if provided, converting from enum if needed
238
+ if purpose is not None:
239
+ params["purpose"] = (
240
+ purpose.value if isinstance(purpose, FilePurpose) else purpose
241
+ )
242
+
243
+ # Create request and use the API requestor
244
+ requestor = api_requestor.APIRequestor(client=self._client)
245
+
246
+ response, _, _ = requestor.request(
247
+ options=SeekrFlowRequest(
248
+ method="GET",
249
+ url="flow/files",
250
+ params=params,
251
+ ),
252
+ stream=False,
253
+ )
254
+
255
+ assert isinstance(response, SeekrFlowResponse)
256
+
257
+ return FileList.parse_obj(response.data)
258
+
259
+ def rename(self, id: str, new_filename: str) -> FileResponse:
260
+ """
261
+ Rename a file.
262
+
263
+ Args:
264
+ id (str): ID of the file to rename.
265
+ new_filename (str): New filename for the file.
266
+
267
+ Returns:
268
+ FileResponse: Object containing information about the renamed file.
269
+ """
201
270
  requestor = api_requestor.APIRequestor(
202
271
  client=self._client,
203
272
  )
204
273
 
205
274
  response, _, _ = requestor.request(
206
275
  options=SeekrFlowRequest(
207
- method="GET",
208
- url="flow/files",
276
+ method="PUT",
277
+ url=f"flow/files/{id}/rename",
278
+ params={"new_filename": new_filename},
209
279
  ),
210
280
  stream=False,
211
281
  )
212
282
 
213
283
  assert isinstance(response, SeekrFlowResponse)
214
- files = [
215
- FileResponse(
216
- id=file["id"],
217
- filename=file["filename"],
218
- created_at=file["created_at"],
219
- object="file",
220
- )
221
- for file in response.data["data"]
222
- ]
223
- return FileList(object="list", data=files)
284
+
285
+ return FileResponse(**response.data)
224
286
 
225
287
 
226
288
  class AsyncFiles(ResourceBase):
@@ -338,19 +400,89 @@ class AsyncFiles(ResourceBase):
338
400
 
339
401
  return file_responses
340
402
 
341
- async def list(self) -> FileList:
403
+ async def list(
404
+ self,
405
+ limit: Optional[int] = None,
406
+ offset: Optional[int] = None,
407
+ sort_by: Optional[str] = None,
408
+ sort_order: Optional[str] = None,
409
+ purpose: Optional[Union[FilePurpose, str]] = None,
410
+ ) -> FileList:
411
+ """
412
+ List files with pagination, sorting, and filtering options.
413
+
414
+ All parameter defaults are handled by the API if not specified.
415
+
416
+ Args:
417
+ limit: Maximum number of files to return
418
+ offset: Number of files to skip
419
+ sort_by: Field to sort by ('created_at', 'filename', 'type', or 'size')
420
+ sort_order: Sort order ('asc' or 'desc')
421
+ purpose: Filter by file purpose (FilePurpose enum or string)
422
+
423
+ Returns:
424
+ A FileList object containing the list of files
425
+
426
+ Raises:
427
+ Exception: If the API request fails
428
+ """
429
+ # Build query parameters, only including non-None values
430
+ params: Dict[str, Any] = {}
431
+ if limit is not None:
432
+ params["limit"] = limit
433
+ if offset is not None:
434
+ params["offset"] = offset
435
+ if sort_by is not None:
436
+ params["sort_by"] = sort_by
437
+ if sort_order is not None:
438
+ params["sort_order"] = sort_order
439
+
440
+ # Add purpose filter if provided, converting from enum if needed
441
+ if purpose is not None:
442
+ params["purpose"] = (
443
+ purpose.value if isinstance(purpose, FilePurpose) else purpose
444
+ )
445
+
446
+ # Create request and use the API requestor
447
+ requestor = api_requestor.APIRequestor(client=self._client)
448
+
449
+ response, _, _ = await requestor.arequest(
450
+ options=SeekrFlowRequest(
451
+ method="GET",
452
+ url="flow/files",
453
+ params=params,
454
+ ),
455
+ stream=False,
456
+ )
457
+
458
+ assert isinstance(response, SeekrFlowResponse)
459
+
460
+ return FileList.parse_obj(response.data)
461
+
462
+ async def rename(self, id: str, new_filename: str) -> FileResponse:
463
+ """
464
+ Rename a file asynchronously.
465
+
466
+ Args:
467
+ id (str): ID of the file to rename.
468
+ new_filename (str): New filename for the file.
469
+
470
+ Returns:
471
+ FileResponse: Object containing information about the renamed file.
472
+ """
342
473
  requestor = api_requestor.APIRequestor(
343
474
  client=self._client,
344
475
  )
345
476
 
346
477
  response, _, _ = await requestor.arequest(
347
478
  options=SeekrFlowRequest(
348
- method="GET",
349
- url="flow/files",
479
+ method="PUT",
480
+ url=f"flow/files/{id}/rename",
481
+ params={"new_filename": new_filename},
350
482
  ),
351
483
  stream=False,
352
484
  )
353
485
 
354
486
  assert isinstance(response, SeekrFlowResponse)
355
487
 
356
- return FileList(**response.data)
488
+ return FileResponse(**response.data)
@@ -14,8 +14,6 @@ class FilePurpose(str, Enum):
14
14
  FineTune = "fine-tune"
15
15
  PreTrain = "pre-train"
16
16
  Alignment = "alignment"
17
- Ingestion = "ingestion"
18
- VectorIngestion = "vector-ingestion"
19
17
 
20
18
 
21
19
  class TrainingFileType(str, Enum):
@@ -96,6 +94,7 @@ class FileResponse(BaseModel):
96
94
  # file byte size
97
95
  bytes: int | None = None
98
96
  created_by: str | None = None # TODO - fix this later
97
+ original_file_id: str | None = None
99
98
  deleted: bool | None = None
100
99
 
101
100
 
@@ -69,6 +69,8 @@ class VectorDatabaseFileResponse(BaseModel):
69
69
  vector_database_id: str
70
70
  filename: str
71
71
  created_at: datetime
72
+ status: str
73
+ error_message: Optional[str]
72
74
 
73
75
 
74
76
  class VectorDatabaseFileList(BaseModel):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes