kainguru-sdk 0.2.14.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.14.dev0 → kainguru_sdk-0.2.16.dev0}/PKG-INFO +1 -1
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/pyproject.toml +1 -1
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/_common.py +7 -5
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/rag.py +7 -11
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_rag.py +8 -9
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/.gitignore +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/MAINTAINERS.md +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/Makefile +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/README.md +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/__init__.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_config.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_errors.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_polling.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_transport.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/async_client.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/client.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/models.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/py.typed +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/__init__.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/executions.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/finetuning.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/conftest.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/resources/openapi.json +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_auth.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_executions.py +0 -0
- {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_finetuning.py +0 -0
- {kainguru_sdk-0.2.14.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"
|
|
@@ -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
|
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|