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.
Files changed (27) hide show
  1. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/PKG-INFO +1 -1
  2. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/pyproject.toml +1 -1
  3. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/_common.py +7 -5
  4. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/rag.py +7 -11
  5. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_rag.py +8 -9
  6. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/.gitignore +0 -0
  7. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/MAINTAINERS.md +0 -0
  8. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/Makefile +0 -0
  9. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/README.md +0 -0
  10. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/__init__.py +0 -0
  11. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_config.py +0 -0
  12. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_errors.py +0 -0
  13. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_polling.py +0 -0
  14. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/_transport.py +0 -0
  15. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/async_client.py +0 -0
  16. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/client.py +0 -0
  17. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/models.py +0 -0
  18. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/py.typed +0 -0
  19. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/__init__.py +0 -0
  20. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/executions.py +0 -0
  21. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/src/kainguru/resources/finetuning.py +0 -0
  22. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/conftest.py +0 -0
  23. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/resources/openapi.json +0 -0
  24. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_auth.py +0 -0
  25. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_executions.py +0 -0
  26. {kainguru_sdk-0.2.14.dev0 → kainguru_sdk-0.2.16.dev0}/tests/test_finetuning.py +0 -0
  27. {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.14.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.14.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"
@@ -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
 
@@ -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"