kainguru-sdk 0.2.13.dev0__tar.gz → 0.2.16.dev0__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 (27) hide show
  1. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/PKG-INFO +1 -1
  2. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/pyproject.toml +1 -1
  3. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/models.py +51 -51
  4. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/_common.py +7 -5
  5. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/rag.py +7 -11
  6. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/resources/openapi.json +114 -133
  7. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_rag.py +8 -9
  8. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/.gitignore +0 -0
  9. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/MAINTAINERS.md +0 -0
  10. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/Makefile +0 -0
  11. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/README.md +0 -0
  12. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/__init__.py +0 -0
  13. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_config.py +0 -0
  14. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_errors.py +0 -0
  15. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_polling.py +0 -0
  16. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_transport.py +0 -0
  17. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/async_client.py +0 -0
  18. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/client.py +0 -0
  19. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/py.typed +0 -0
  20. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/__init__.py +0 -0
  21. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/executions.py +0 -0
  22. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/finetuning.py +0 -0
  23. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/conftest.py +0 -0
  24. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_auth.py +0 -0
  25. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_executions.py +0 -0
  26. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_finetuning.py +0 -0
  27. {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_polling.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kainguru-sdk
3
- Version: 0.2.13.dev0
3
+ Version: 0.2.16.dev0
4
4
  Summary: Python SDK for the Kainguru ML platform — run models and fine-tune them.
5
5
  Project-URL: Homepage, https://kainguru.com
6
6
  Project-URL: Repository, https://github.com/kainguru/kainguru
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kainguru-sdk"
7
- version = "0.2.13.dev0"
7
+ version = "0.2.16.dev0"
8
8
  description = "Python SDK for the Kainguru ML platform — run models and fine-tune them."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -16,15 +16,6 @@ class RagIngestRequestDto(BaseModel):
16
16
  params: dict[str, Any] | None = None
17
17
 
18
18
 
19
- class CategoryShortDto(BaseModel):
20
- id: UUID | None = None
21
- slug: str | None = None
22
- name: str | None = None
23
- icon: str | None = None
24
- createDate: AwareDatetime | None = None
25
- modifiedDate: AwareDatetime | None = None
26
-
27
-
28
19
  class FileType(Enum):
29
20
  JPEG = 'JPEG'
30
21
  PNG = 'PNG'
@@ -75,27 +66,6 @@ class FileDto(BaseModel):
75
66
  accessLevel: AccessLevel | None = None
76
67
 
77
68
 
78
- class AccessType(Enum):
79
- PUBLIC = 'PUBLIC'
80
- PRIVATE = 'PRIVATE'
81
-
82
-
83
- class GpuType(Enum):
84
- B200 = 'B200'
85
- H200 = 'H200'
86
- H100 = 'H100'
87
- A100 = 'A100'
88
- V100 = 'V100'
89
- MI300X = 'MI300X'
90
- L40S = 'L40S'
91
- RTX_5090 = 'RTX_5090'
92
- RTX_4090 = 'RTX_4090'
93
- L4 = 'L4'
94
- RTX_4070_SUPER = 'RTX_4070_SUPER'
95
- RTX_4060_TI = 'RTX_4060_TI'
96
- RX_7900_XTX = 'RX_7900_XTX'
97
-
98
-
99
69
  class ModelStatus(Enum):
100
70
  PENDING = 'PENDING'
101
71
  RUNNING = 'RUNNING'
@@ -150,6 +120,15 @@ class ModelFineTuneRequestDto(BaseModel):
150
120
  input: dict[str, Any]
151
121
 
152
122
 
123
+ class CategoryShortDto(BaseModel):
124
+ id: UUID | None = None
125
+ slug: str | None = None
126
+ name: str | None = None
127
+ icon: str | None = None
128
+ createDate: AwareDatetime | None = None
129
+ modifiedDate: AwareDatetime | None = None
130
+
131
+
153
132
  class FineTuneResultDto(BaseModel):
154
133
  id: UUID | None = None
155
134
  status: ModelStatus | None = None
@@ -198,6 +177,47 @@ class ModelExecInputDto(BaseModel):
198
177
  requiredWhen: dict[str, Any] | None = None
199
178
 
200
179
 
180
+ class AccessType(Enum):
181
+ PUBLIC = 'PUBLIC'
182
+ PRIVATE = 'PRIVATE'
183
+
184
+
185
+ class GpuType(Enum):
186
+ B200 = 'B200'
187
+ H200 = 'H200'
188
+ H100 = 'H100'
189
+ A100 = 'A100'
190
+ V100 = 'V100'
191
+ MI300X = 'MI300X'
192
+ L40S = 'L40S'
193
+ RTX_5090 = 'RTX_5090'
194
+ RTX_4090 = 'RTX_4090'
195
+ L4 = 'L4'
196
+ RTX_4070_SUPER = 'RTX_4070_SUPER'
197
+ RTX_4060_TI = 'RTX_4060_TI'
198
+ RX_7900_XTX = 'RX_7900_XTX'
199
+
200
+
201
+ class ModelListDto(BaseModel):
202
+ id: UUID | None = None
203
+ name: str | None = None
204
+ description: str | None = None
205
+ accessType: AccessType | None = None
206
+ fineTuneEnabled: bool | None = None
207
+ ragEnabled: bool | None = None
208
+ status: ModelStatus | None = None
209
+ version: str | None = None
210
+ tags: list[str] | None = None
211
+ executionCount: int | None = None
212
+ fineTuneCount: int | None = None
213
+ gpuType: GpuType | None = None
214
+ gpuMemoryGb: int | None = None
215
+ category: CategoryShortDto | None = None
216
+ createDate: AwareDatetime | None = None
217
+ modifiedDate: AwareDatetime | None = None
218
+ banner: str | None = None
219
+
220
+
201
221
  class UserDto(BaseModel):
202
222
  id: UUID | None = None
203
223
  username: str | None = None
@@ -260,7 +280,6 @@ class RagKnowledgeBaseDto(BaseModel):
260
280
  name: str | None = None
261
281
  ragHandle: str | None = None
262
282
  status: ModelStatus | None = None
263
- model: ModelExecModelRefDto | None = None
264
283
  createDate: AwareDatetime | None = None
265
284
  modifiedDate: AwareDatetime | None = None
266
285
 
@@ -271,31 +290,11 @@ class RagKnowledgeBaseListApiResponse(BaseModel):
271
290
  data: list[RagKnowledgeBaseDto] | None = None
272
291
 
273
292
 
274
- class ModelListDto(BaseModel):
275
- id: UUID | None = None
276
- name: str | None = None
277
- description: str | None = None
278
- accessType: AccessType | None = None
279
- fineTuneEnabled: bool | None = None
280
- status: ModelStatus | None = None
281
- version: str | None = None
282
- tags: list[str] | None = None
283
- executionCount: int | None = None
284
- fineTuneCount: int | None = None
285
- gpuType: GpuType | None = None
286
- gpuMemoryGb: int | None = None
287
- category: CategoryShortDto | None = None
288
- createDate: AwareDatetime | None = None
289
- modifiedDate: AwareDatetime | None = None
290
- banner: str | None = None
291
-
292
-
293
293
  class RagKnowledgeBaseDetailDto(BaseModel):
294
294
  id: UUID | None = None
295
295
  name: str | None = None
296
296
  ragHandle: str | None = None
297
297
  status: ModelStatus | None = None
298
- model: ModelListDto | None = None
299
298
  files: list[FileDto] | None = None
300
299
  latestOperation: RagOperationResultDto | None = None
301
300
  createDate: AwareDatetime | None = None
@@ -344,6 +343,7 @@ class ExecutionResultDto(BaseModel):
344
343
  loraRunId: str | None = None
345
344
  ragHandle: str | None = None
346
345
  ragRequest: RagRequestDto | None = None
346
+ ragKnowledgeBaseId: UUID | None = None
347
347
 
348
348
 
349
349
  class ModelExecResponseDto(BaseModel):
@@ -70,17 +70,19 @@ def fine_tune_args(
70
70
 
71
71
 
72
72
  def rag_ingest_args(
73
- model_id: str,
74
73
  name: str,
75
74
  file_ids: list[str],
76
75
  params: dict[str, Any] | None,
77
- ) -> tuple[dict[str, Any], dict[str, Any]]:
78
- """Build the ``(query, body)`` pair for ``POST /v1/rag``."""
79
- query: dict[str, Any] = {"modelId": model_id}
76
+ ) -> dict[str, Any]:
77
+ """Build the request body for ``POST /v1/rag``.
78
+
79
+ A knowledge base is model-independent — no model is chosen at creation (no modelId query
80
+ param); the model is selected per execution.
81
+ """
80
82
  body: dict[str, Any] = {"name": name, "fileIds": file_ids}
81
83
  if params is not None:
82
84
  body["params"] = params
83
- return query, body
85
+ return body
84
86
 
85
87
 
86
88
  def rag_file_selection_args(file_ids: list[str]) -> dict[str, Any]:
@@ -49,7 +49,6 @@ class RagResource:
49
49
 
50
50
  def ingest(
51
51
  self,
52
- model_id: str,
53
52
  name: str,
54
53
  file_ids: list[str],
55
54
  params: dict[str, Any] | None = None,
@@ -58,14 +57,13 @@ class RagResource:
58
57
  ) -> RagKnowledgeBaseDetailDto:
59
58
  """Ingest documents into a new RAG knowledge base.
60
59
 
61
- Returns immediately (typically ``PENDING``).
60
+ A knowledge base is model-independent — no model is chosen at creation; the model is
61
+ selected per execution. Returns immediately (typically ``PENDING``).
62
62
  """
63
- if not model_id:
64
- raise KainguruConfigError("model_id is required")
65
63
  if not file_ids:
66
64
  raise KainguruConfigError("file_ids is required")
67
- query, body = rag_ingest_args(model_id, name, file_ids, params)
68
- response = self._t.request("POST", _PATH, params=query, json=body, api_key=api_key)
65
+ body = rag_ingest_args(name, file_ids, params)
66
+ response = self._t.request("POST", _PATH, json=body, api_key=api_key)
69
67
  return unwrap(response, RagKnowledgeBaseDetailDto)
70
68
 
71
69
  def get(self, id: str, *, api_key: str | None = None) -> RagKnowledgeBaseDetailDto:
@@ -159,20 +157,18 @@ class AsyncRagResource:
159
157
 
160
158
  async def ingest(
161
159
  self,
162
- model_id: str,
163
160
  name: str,
164
161
  file_ids: list[str],
165
162
  params: dict[str, Any] | None = None,
166
163
  *,
167
164
  api_key: str | None = None,
168
165
  ) -> RagKnowledgeBaseDetailDto:
169
- if not model_id:
170
- raise KainguruConfigError("model_id is required")
166
+ # A knowledge base is model-independent — no model at creation; selected per execution.
171
167
  if not file_ids:
172
168
  raise KainguruConfigError("file_ids is required")
173
- query, body = rag_ingest_args(model_id, name, file_ids, params)
169
+ body = rag_ingest_args(name, file_ids, params)
174
170
  response = await self._t.request(
175
- "POST", _PATH, params=query, json=body, api_key=api_key
171
+ "POST", _PATH, json=body, api_key=api_key
176
172
  )
177
173
  return unwrap(response, RagKnowledgeBaseDetailDto)
178
174
 
@@ -35,15 +35,6 @@
35
35
  "schema": {
36
36
  "$ref": "#/components/schemas/ModelStatus"
37
37
  }
38
- },
39
- {
40
- "name": "modelId",
41
- "in": "query",
42
- "required": false,
43
- "schema": {
44
- "type": "string",
45
- "format": "uuid"
46
- }
47
38
  }
48
39
  ],
49
40
  "responses": {
@@ -103,17 +94,6 @@
103
94
  ],
104
95
  "description": "Ingest documents into a new RAG knowledge base",
105
96
  "operationId": "ingestRag",
106
- "parameters": [
107
- {
108
- "name": "modelId",
109
- "in": "query",
110
- "required": true,
111
- "schema": {
112
- "type": "string",
113
- "format": "uuid"
114
- }
115
- }
116
- ],
117
97
  "requestBody": {
118
98
  "content": {
119
99
  "application/json": {
@@ -1370,32 +1350,6 @@
1370
1350
  "name"
1371
1351
  ]
1372
1352
  },
1373
- "CategoryShortDto": {
1374
- "type": "object",
1375
- "properties": {
1376
- "id": {
1377
- "type": "string",
1378
- "format": "uuid"
1379
- },
1380
- "slug": {
1381
- "type": "string"
1382
- },
1383
- "name": {
1384
- "type": "string"
1385
- },
1386
- "icon": {
1387
- "type": "string"
1388
- },
1389
- "createDate": {
1390
- "type": "string",
1391
- "format": "date-time"
1392
- },
1393
- "modifiedDate": {
1394
- "type": "string",
1395
- "format": "date-time"
1396
- }
1397
- }
1398
- },
1399
1353
  "FileDto": {
1400
1354
  "type": "object",
1401
1355
  "properties": {
@@ -1459,87 +1413,6 @@
1459
1413
  }
1460
1414
  }
1461
1415
  },
1462
- "ModelListDto": {
1463
- "type": "object",
1464
- "properties": {
1465
- "id": {
1466
- "type": "string",
1467
- "format": "uuid"
1468
- },
1469
- "name": {
1470
- "type": "string"
1471
- },
1472
- "description": {
1473
- "type": "string"
1474
- },
1475
- "accessType": {
1476
- "type": "string",
1477
- "enum": [
1478
- "PUBLIC",
1479
- "PRIVATE"
1480
- ]
1481
- },
1482
- "fineTuneEnabled": {
1483
- "type": "boolean"
1484
- },
1485
- "status": {
1486
- "$ref": "#/components/schemas/ModelStatus"
1487
- },
1488
- "version": {
1489
- "type": "string"
1490
- },
1491
- "tags": {
1492
- "type": "array",
1493
- "items": {
1494
- "type": "string"
1495
- }
1496
- },
1497
- "executionCount": {
1498
- "type": "integer",
1499
- "format": "int64"
1500
- },
1501
- "fineTuneCount": {
1502
- "type": "integer",
1503
- "format": "int64"
1504
- },
1505
- "gpuType": {
1506
- "type": "string",
1507
- "enum": [
1508
- "B200",
1509
- "H200",
1510
- "H100",
1511
- "A100",
1512
- "V100",
1513
- "MI300X",
1514
- "L40S",
1515
- "RTX_5090",
1516
- "RTX_4090",
1517
- "L4",
1518
- "RTX_4070_SUPER",
1519
- "RTX_4060_TI",
1520
- "RX_7900_XTX"
1521
- ]
1522
- },
1523
- "gpuMemoryGb": {
1524
- "type": "integer",
1525
- "format": "int32"
1526
- },
1527
- "category": {
1528
- "$ref": "#/components/schemas/CategoryShortDto"
1529
- },
1530
- "createDate": {
1531
- "type": "string",
1532
- "format": "date-time"
1533
- },
1534
- "modifiedDate": {
1535
- "type": "string",
1536
- "format": "date-time"
1537
- },
1538
- "banner": {
1539
- "type": "string"
1540
- }
1541
- }
1542
- },
1543
1416
  "ModelStatus": {
1544
1417
  "type": "string",
1545
1418
  "enum": [
@@ -1583,9 +1456,6 @@
1583
1456
  "status": {
1584
1457
  "$ref": "#/components/schemas/ModelStatus"
1585
1458
  },
1586
- "model": {
1587
- "$ref": "#/components/schemas/ModelListDto"
1588
- },
1589
1459
  "files": {
1590
1460
  "type": "array",
1591
1461
  "items": {
@@ -1773,6 +1643,32 @@
1773
1643
  "name"
1774
1644
  ]
1775
1645
  },
1646
+ "CategoryShortDto": {
1647
+ "type": "object",
1648
+ "properties": {
1649
+ "id": {
1650
+ "type": "string",
1651
+ "format": "uuid"
1652
+ },
1653
+ "slug": {
1654
+ "type": "string"
1655
+ },
1656
+ "name": {
1657
+ "type": "string"
1658
+ },
1659
+ "icon": {
1660
+ "type": "string"
1661
+ },
1662
+ "createDate": {
1663
+ "type": "string",
1664
+ "format": "date-time"
1665
+ },
1666
+ "modifiedDate": {
1667
+ "type": "string",
1668
+ "format": "date-time"
1669
+ }
1670
+ }
1671
+ },
1776
1672
  "FineTuneResultDto": {
1777
1673
  "type": "object",
1778
1674
  "properties": {
@@ -1957,6 +1853,90 @@
1957
1853
  }
1958
1854
  }
1959
1855
  },
1856
+ "ModelListDto": {
1857
+ "type": "object",
1858
+ "properties": {
1859
+ "id": {
1860
+ "type": "string",
1861
+ "format": "uuid"
1862
+ },
1863
+ "name": {
1864
+ "type": "string"
1865
+ },
1866
+ "description": {
1867
+ "type": "string"
1868
+ },
1869
+ "accessType": {
1870
+ "type": "string",
1871
+ "enum": [
1872
+ "PUBLIC",
1873
+ "PRIVATE"
1874
+ ]
1875
+ },
1876
+ "fineTuneEnabled": {
1877
+ "type": "boolean"
1878
+ },
1879
+ "ragEnabled": {
1880
+ "type": "boolean"
1881
+ },
1882
+ "status": {
1883
+ "$ref": "#/components/schemas/ModelStatus"
1884
+ },
1885
+ "version": {
1886
+ "type": "string"
1887
+ },
1888
+ "tags": {
1889
+ "type": "array",
1890
+ "items": {
1891
+ "type": "string"
1892
+ }
1893
+ },
1894
+ "executionCount": {
1895
+ "type": "integer",
1896
+ "format": "int64"
1897
+ },
1898
+ "fineTuneCount": {
1899
+ "type": "integer",
1900
+ "format": "int64"
1901
+ },
1902
+ "gpuType": {
1903
+ "type": "string",
1904
+ "enum": [
1905
+ "B200",
1906
+ "H200",
1907
+ "H100",
1908
+ "A100",
1909
+ "V100",
1910
+ "MI300X",
1911
+ "L40S",
1912
+ "RTX_5090",
1913
+ "RTX_4090",
1914
+ "L4",
1915
+ "RTX_4070_SUPER",
1916
+ "RTX_4060_TI",
1917
+ "RX_7900_XTX"
1918
+ ]
1919
+ },
1920
+ "gpuMemoryGb": {
1921
+ "type": "integer",
1922
+ "format": "int32"
1923
+ },
1924
+ "category": {
1925
+ "$ref": "#/components/schemas/CategoryShortDto"
1926
+ },
1927
+ "createDate": {
1928
+ "type": "string",
1929
+ "format": "date-time"
1930
+ },
1931
+ "modifiedDate": {
1932
+ "type": "string",
1933
+ "format": "date-time"
1934
+ },
1935
+ "banner": {
1936
+ "type": "string"
1937
+ }
1938
+ }
1939
+ },
1960
1940
  "UserDto": {
1961
1941
  "type": "object",
1962
1942
  "properties": {
@@ -2110,6 +2090,10 @@
2110
2090
  },
2111
2091
  "ragRequest": {
2112
2092
  "$ref": "#/components/schemas/RagRequestDto"
2093
+ },
2094
+ "ragKnowledgeBaseId": {
2095
+ "type": "string",
2096
+ "format": "uuid"
2113
2097
  }
2114
2098
  }
2115
2099
  },
@@ -2234,9 +2218,6 @@
2234
2218
  "status": {
2235
2219
  "$ref": "#/components/schemas/ModelStatus"
2236
2220
  },
2237
- "model": {
2238
- "$ref": "#/components/schemas/ModelExecModelRefDto"
2239
- },
2240
2221
  "createDate": {
2241
2222
  "type": "string",
2242
2223
  "format": "date-time"
@@ -30,12 +30,12 @@ def _envelope(data: Any) -> dict[str, Any]:
30
30
  return {"success": True, "code": 200, "data": data}
31
31
 
32
32
 
33
- def test_ingest_posts_model_id_query_and_body(client: KainguruClient, respx_mock):
33
+ def test_ingest_posts_body_no_model_id(client: KainguruClient, respx_mock):
34
34
  route = respx_mock.post(RAG_URL).mock(
35
35
  return_value=httpx.Response(200, json=_envelope(_detail()))
36
36
  )
37
37
 
38
- dto = client.rag.ingest(MODEL_ID, "kb-1", [FILE_ID_1, FILE_ID_2])
38
+ dto = client.rag.ingest("kb-1", [FILE_ID_1, FILE_ID_2])
39
39
 
40
40
  assert str(dto.id) == KB_ID
41
41
  assert dto.status.value == "PENDING"
@@ -43,7 +43,8 @@ def test_ingest_posts_model_id_query_and_body(client: KainguruClient, respx_mock
43
43
 
44
44
  request = route.calls.last.request
45
45
  assert request.headers["X-API-Key"] == "kg_test_key"
46
- assert request.url.params["modelId"] == MODEL_ID
46
+ # A knowledge base is model-independent: no modelId query param.
47
+ assert "modelId" not in request.url.params
47
48
  assert json.loads(request.content) == {
48
49
  "name": "kb-1",
49
50
  "fileIds": [FILE_ID_1, FILE_ID_2],
@@ -55,17 +56,15 @@ def test_ingest_includes_params_when_given(client: KainguruClient, respx_mock):
55
56
  return_value=httpx.Response(200, json=_envelope(_detail()))
56
57
  )
57
58
 
58
- client.rag.ingest(MODEL_ID, "kb-1", [FILE_ID_1], params={"chunkSize": 512})
59
+ client.rag.ingest("kb-1", [FILE_ID_1], params={"chunkSize": 512})
59
60
 
60
61
  body = json.loads(route.calls.last.request.content)
61
62
  assert body == {"name": "kb-1", "fileIds": [FILE_ID_1], "params": {"chunkSize": 512}}
62
63
 
63
64
 
64
- def test_ingest_requires_model_id_and_file_ids(client: KainguruClient, respx_mock):
65
+ def test_ingest_requires_file_ids(client: KainguruClient, respx_mock):
65
66
  with pytest.raises(KainguruConfigError):
66
- client.rag.ingest("", "kb-1", [FILE_ID_1])
67
- with pytest.raises(KainguruConfigError):
68
- client.rag.ingest(MODEL_ID, "kb-1", [])
67
+ client.rag.ingest("kb-1", [])
69
68
 
70
69
 
71
70
  def test_get_unwraps_to_detail_dto(client: KainguruClient, respx_mock):
@@ -152,7 +151,7 @@ def test_cancel(client: KainguruClient, respx_mock):
152
151
  async def test_async_ingest(async_client: AsyncKainguruClient, respx_mock):
153
152
  respx_mock.post(RAG_URL).mock(return_value=httpx.Response(200, json=_envelope(_detail())))
154
153
 
155
- dto = await async_client.rag.ingest(MODEL_ID, "kb-1", [FILE_ID_1])
154
+ dto = await async_client.rag.ingest("kb-1", [FILE_ID_1])
156
155
 
157
156
  assert str(dto.id) == KB_ID
158
157
  assert dto.status.value == "PENDING"