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.
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/PKG-INFO +1 -1
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/pyproject.toml +1 -1
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/models.py +51 -51
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/_common.py +7 -5
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/rag.py +7 -11
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/resources/openapi.json +114 -133
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_rag.py +8 -9
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/.gitignore +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/MAINTAINERS.md +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/Makefile +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/README.md +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/__init__.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_config.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_errors.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_polling.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_transport.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/async_client.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/client.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/py.typed +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/__init__.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/executions.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/finetuning.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/conftest.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_auth.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_executions.py +0 -0
- {kainguru_sdk-0.2.13.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_finetuning.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
) ->
|
|
78
|
-
"""Build the
|
|
79
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
response = self._t.request("POST", _PATH,
|
|
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
|
-
|
|
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
|
-
|
|
169
|
+
body = rag_ingest_args(name, file_ids, params)
|
|
174
170
|
response = await self._t.request(
|
|
175
|
-
"POST", _PATH,
|
|
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
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
65
|
+
def test_ingest_requires_file_ids(client: KainguruClient, respx_mock):
|
|
65
66
|
with pytest.raises(KainguruConfigError):
|
|
66
|
-
client.rag.ingest("
|
|
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(
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|