seekrai 0.5.0__tar.gz → 0.5.2__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 (67) hide show
  1. {seekrai-0.5.0 → seekrai-0.5.2}/PKG-INFO +5 -5
  2. {seekrai-0.5.0 → seekrai-0.5.2}/README.md +4 -4
  3. {seekrai-0.5.0 → seekrai-0.5.2}/pyproject.toml +1 -1
  4. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/chat/completions.py +1 -1
  5. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/files.py +150 -18
  6. seekrai-0.5.2/src/seekrai/types/agents/tools/schemas/file_search_env.py +16 -0
  7. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/files.py +1 -2
  8. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/vectordb.py +2 -0
  9. seekrai-0.5.0/src/seekrai/types/agents/tools/schemas/file_search_env.py +0 -11
  10. {seekrai-0.5.0 → seekrai-0.5.2}/LICENSE +0 -0
  11. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/__init__.py +0 -0
  12. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/abstract/__init__.py +0 -0
  13. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/abstract/api_requestor.py +0 -0
  14. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/abstract/response_parsing.py +0 -0
  15. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/client.py +0 -0
  16. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/constants.py +0 -0
  17. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/error.py +0 -0
  18. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/filemanager.py +0 -0
  19. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/__init__.py +0 -0
  20. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/agents/__init__.py +0 -0
  21. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/agents/agent_inference.py +0 -0
  22. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/agents/agents.py +0 -0
  23. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/agents/threads.py +0 -0
  24. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/alignment.py +0 -0
  25. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/chat/__init__.py +0 -0
  26. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/completions.py +0 -0
  27. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/deployments.py +0 -0
  28. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/embeddings.py +0 -0
  29. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/finetune.py +0 -0
  30. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/images.py +0 -0
  31. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/ingestion.py +0 -0
  32. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/models.py +0 -0
  33. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/projects.py +0 -0
  34. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/resource_base.py +0 -0
  35. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/resources/vectordb.py +0 -0
  36. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/seekrflow_response.py +0 -0
  37. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/__init__.py +0 -0
  38. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/abstract.py +0 -0
  39. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/__init__.py +0 -0
  40. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/agent.py +0 -0
  41. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/runs.py +0 -0
  42. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/threads.py +0 -0
  43. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/__init__.py +0 -0
  44. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/env_model_config.py +0 -0
  45. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/schemas/__init__.py +0 -0
  46. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/schemas/file_search.py +0 -0
  47. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/tool.py +0 -0
  48. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/tool_env_types.py +0 -0
  49. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/agents/tools/tool_types.py +0 -0
  50. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/alignment.py +0 -0
  51. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/chat_completions.py +0 -0
  52. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/common.py +0 -0
  53. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/completions.py +0 -0
  54. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/deployments.py +0 -0
  55. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/embeddings.py +0 -0
  56. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/error.py +0 -0
  57. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/finetune.py +0 -0
  58. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/images.py +0 -0
  59. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/ingestion.py +0 -0
  60. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/models.py +0 -0
  61. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/types/projects.py +0 -0
  62. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/utils/__init__.py +0 -0
  63. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/utils/_log.py +0 -0
  64. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/utils/api_helpers.py +0 -0
  65. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/utils/files.py +0 -0
  66. {seekrai-0.5.0 → seekrai-0.5.2}/src/seekrai/utils/tools.py +0 -0
  67. {seekrai-0.5.0 → seekrai-0.5.2}/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.2
4
4
  Summary: Python client for SeekrAI
5
5
  License: Apache-2.0
6
6
  Author: SeekrFlow
@@ -70,7 +70,7 @@ from seekrai import SeekrFlow
70
70
  client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
71
71
 
72
72
  response = client.chat.completions.create(
73
- model="meta-llama-3-8b-instruct",
73
+ model="meta-llama/Llama-3.1-8B-Instruct",
74
74
  messages=[{"role": "user", "content": "tell me about new york"}],
75
75
  )
76
76
  print(response.choices[0].message.content)
@@ -84,7 +84,7 @@ from seekrai import SeekrFlow
84
84
 
85
85
  client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
86
86
  stream = client.chat.completions.create(
87
- model="meta-llama-3-8b-instruct",
87
+ model="meta-llama/Llama-3.1-8B-Instruct",
88
88
  messages=[{"role": "user", "content": "tell me about new york"}],
89
89
  stream=True,
90
90
  )
@@ -110,7 +110,7 @@ async def async_chat_completion(messages):
110
110
  async_client = AsyncSeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
111
111
  tasks = [
112
112
  async_client.chat.completions.create(
113
- model="meta-llama-3-8b-instruct",
113
+ model="meta-llama/Llama-3.1-8B-Instruct",
114
114
  messages=[{"role": "user", "content": message}],
115
115
  )
116
116
  for message in messages
@@ -151,7 +151,7 @@ client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
151
151
 
152
152
  client.fine_tuning.create(
153
153
  training_file='file-d0d318cb-b7d9-493a-bd70-1cfe089d3815',
154
- model='meta-llama-3-8b-instruct',
154
+ model='meta-llama/Llama-3.1-8B-Instruct',
155
155
  n_epochs=3,
156
156
  n_checkpoints=1,
157
157
  batch_size=4,
@@ -37,7 +37,7 @@ from seekrai import SeekrFlow
37
37
  client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
38
38
 
39
39
  response = client.chat.completions.create(
40
- model="meta-llama-3-8b-instruct",
40
+ model="meta-llama/Llama-3.1-8B-Instruct",
41
41
  messages=[{"role": "user", "content": "tell me about new york"}],
42
42
  )
43
43
  print(response.choices[0].message.content)
@@ -51,7 +51,7 @@ from seekrai import SeekrFlow
51
51
 
52
52
  client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
53
53
  stream = client.chat.completions.create(
54
- model="meta-llama-3-8b-instruct",
54
+ model="meta-llama/Llama-3.1-8B-Instruct",
55
55
  messages=[{"role": "user", "content": "tell me about new york"}],
56
56
  stream=True,
57
57
  )
@@ -77,7 +77,7 @@ async def async_chat_completion(messages):
77
77
  async_client = AsyncSeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
78
78
  tasks = [
79
79
  async_client.chat.completions.create(
80
- model="meta-llama-3-8b-instruct",
80
+ model="meta-llama/Llama-3.1-8B-Instruct",
81
81
  messages=[{"role": "user", "content": message}],
82
82
  )
83
83
  for message in messages
@@ -118,7 +118,7 @@ client = SeekrFlow(api_key=os.environ.get("SEEKR_API_KEY"))
118
118
 
119
119
  client.fine_tuning.create(
120
120
  training_file='file-d0d318cb-b7d9-493a-bd70-1cfe089d3815',
121
- model='meta-llama-3-8b-instruct',
121
+ model='meta-llama/Llama-3.1-8B-Instruct',
122
122
  n_epochs=3,
123
123
  n_checkpoints=1,
124
124
  batch_size=4,
@@ -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.2"
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)
@@ -0,0 +1,16 @@
1
+ from pydantic import Field
2
+
3
+ from seekrai.types.agents.tools.env_model_config import EnvConfig
4
+
5
+
6
+ # TODO: figure out better way of creating tool environment models (within tool ideally), but retaining separate model_configs
7
+ class FileSearchEnv(EnvConfig):
8
+ file_search_index: str = Field(min_length=1)
9
+ document_tool_desc: str = Field(min_length=1)
10
+ top_k: int = Field(
11
+ default=10, ge=1, le=100, description="Top K must be >= 1 and <= 100"
12
+ )
13
+ score_threshold: float = Field(
14
+ default=0, ge=0, lt=1.0, description="Score must be ≥ 0.0 and < 1.0"
15
+ )
16
+
@@ -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):
@@ -1,11 +0,0 @@
1
- from pydantic import Field
2
-
3
- from seekrai.types.agents.tools.env_model_config import EnvConfig
4
-
5
-
6
- # TODO: figure out better way of creating tool environment models (within tool ideally), but retaining separate model_configs
7
- class FileSearchEnv(EnvConfig):
8
- file_search_index: str
9
- document_tool_desc: str
10
- top_k: int = Field(default=10)
11
- score_threshold: int = Field(default=0)
File without changes
File without changes
File without changes
File without changes
File without changes