knowledge2 0.4.1__tar.gz → 0.5.0__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 (158) hide show
  1. knowledge2-0.5.0/MANIFEST.in +5 -0
  2. knowledge2-0.5.0/PKG-INFO +217 -0
  3. knowledge2-0.5.0/README.md +189 -0
  4. {knowledge2-0.4.1 → knowledge2-0.5.0}/_version.py +1 -1
  5. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_client.py +2 -6
  6. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/__init__.py +2 -6
  7. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/console.py +0 -4
  8. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/corpora.py +0 -62
  9. knowledge2-0.5.0/async_resources/generation_models.py +29 -0
  10. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/indexes.py +46 -2
  11. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/onboarding.py +16 -11
  12. {knowledge2-0.4.1 → knowledge2-0.5.0}/client.py +2 -34
  13. knowledge2-0.5.0/examples/e2e_lifecycle.py +178 -0
  14. knowledge2-0.5.0/examples/retrieval_quickstart.py +58 -0
  15. knowledge2-0.5.0/knowledge2.egg-info/PKG-INFO +217 -0
  16. {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/SOURCES.txt +11 -30
  17. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/_registry.py +19 -48
  18. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/agents.py +34 -0
  19. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/console.py +0 -3
  20. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/corpora.py +1 -6
  21. knowledge2-0.5.0/models/generation_models.py +16 -0
  22. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/indexes.py +5 -2
  23. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/onboarding.py +13 -5
  24. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/projects.py +0 -3
  25. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/search.py +1 -34
  26. {knowledge2-0.4.1 → knowledge2-0.5.0}/namespaces.py +0 -109
  27. {knowledge2-0.4.1 → knowledge2-0.5.0}/pyproject.toml +1 -1
  28. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/__init__.py +2 -6
  29. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/corpora.py +0 -57
  30. knowledge2-0.5.0/resources/generation_models.py +29 -0
  31. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/indexes.py +51 -2
  32. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/onboarding.py +16 -12
  33. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/__init__.py +12 -32
  34. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/agents.py +48 -1
  35. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/corpora.py +0 -1
  36. knowledge2-0.5.0/types/generation_models.py +14 -0
  37. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/indexes.py +6 -1
  38. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/onboarding.py +13 -5
  39. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/projects.py +0 -1
  40. knowledge2-0.4.1/AGENTS.md +0 -31
  41. knowledge2-0.4.1/PKG-INFO +0 -662
  42. knowledge2-0.4.1/README.md +0 -634
  43. knowledge2-0.4.1/async_resources/deployments.py +0 -106
  44. knowledge2-0.4.1/async_resources/models.py +0 -102
  45. knowledge2-0.4.1/async_resources/training.py +0 -357
  46. knowledge2-0.4.1/examples/e2e_lifecycle.py +0 -213
  47. knowledge2-0.4.1/knowledge2.egg-info/PKG-INFO +0 -662
  48. knowledge2-0.4.1/models/deployments.py +0 -13
  49. knowledge2-0.4.1/models/evaluation.py +0 -17
  50. knowledge2-0.4.1/models/models.py +0 -26
  51. knowledge2-0.4.1/models/training.py +0 -57
  52. knowledge2-0.4.1/resources/deployments.py +0 -105
  53. knowledge2-0.4.1/resources/models.py +0 -99
  54. knowledge2-0.4.1/resources/training.py +0 -358
  55. knowledge2-0.4.1/specification.md +0 -129
  56. knowledge2-0.4.1/types/deployments.py +0 -11
  57. knowledge2-0.4.1/types/evaluation.py +0 -15
  58. knowledge2-0.4.1/types/models.py +0 -22
  59. knowledge2-0.4.1/types/training.py +0 -55
  60. {knowledge2-0.4.1 → knowledge2-0.5.0}/.github/workflows/pypi-release.yml +0 -0
  61. {knowledge2-0.4.1 → knowledge2-0.5.0}/CHANGELOG.md +0 -0
  62. {knowledge2-0.4.1 → knowledge2-0.5.0}/__init__.py +0 -0
  63. {knowledge2-0.4.1 → knowledge2-0.5.0}/_async_base.py +0 -0
  64. {knowledge2-0.4.1 → knowledge2-0.5.0}/_async_paging.py +0 -0
  65. {knowledge2-0.4.1 → knowledge2-0.5.0}/_base.py +0 -0
  66. {knowledge2-0.4.1 → knowledge2-0.5.0}/_logging.py +0 -0
  67. {knowledge2-0.4.1 → knowledge2-0.5.0}/_paging.py +0 -0
  68. {knowledge2-0.4.1 → knowledge2-0.5.0}/_preview.py +0 -0
  69. {knowledge2-0.4.1 → knowledge2-0.5.0}/_raw_response.py +0 -0
  70. {knowledge2-0.4.1 → knowledge2-0.5.0}/_request_options.py +0 -0
  71. {knowledge2-0.4.1 → knowledge2-0.5.0}/_transport.py +0 -0
  72. {knowledge2-0.4.1 → knowledge2-0.5.0}/_validation.py +0 -0
  73. {knowledge2-0.4.1 → knowledge2-0.5.0}/_validation_response.py +0 -0
  74. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/_mixin_base.py +0 -0
  75. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/a2a.py +0 -0
  76. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/agents.py +0 -0
  77. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/audit.py +0 -0
  78. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/auth.py +0 -0
  79. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/documents.py +0 -0
  80. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/feeds.py +0 -0
  81. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/jobs.py +0 -0
  82. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/metadata.py +0 -0
  83. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/orgs.py +0 -0
  84. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/pipelines.py +0 -0
  85. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/projects.py +0 -0
  86. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/search.py +0 -0
  87. {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/usage.py +0 -0
  88. {knowledge2-0.4.1 → knowledge2-0.5.0}/config.py +0 -0
  89. {knowledge2-0.4.1 → knowledge2-0.5.0}/errors.py +0 -0
  90. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/auth_factory.py +0 -0
  91. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/batch_operations.py +0 -0
  92. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/document_upload.py +0 -0
  93. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/error_handling.py +0 -0
  94. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/pagination.py +0 -0
  95. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/quickstart.py +0 -0
  96. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/request_options.py +0 -0
  97. {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/search.py +0 -0
  98. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/__init__.py +0 -0
  99. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/_client.py +0 -0
  100. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/__init__.py +0 -0
  101. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/retriever.py +0 -0
  102. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/tools.py +0 -0
  103. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/__init__.py +0 -0
  104. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/filters.py +0 -0
  105. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/retriever.py +0 -0
  106. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/tools.py +0 -0
  107. {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/vector_store.py +0 -0
  108. {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/dependency_links.txt +0 -0
  109. {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/requires.txt +0 -0
  110. {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/top_level.txt +0 -0
  111. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/__init__.py +0 -0
  112. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/_base.py +0 -0
  113. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/a2a.py +0 -0
  114. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/audit.py +0 -0
  115. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/auth.py +0 -0
  116. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/chunks.py +0 -0
  117. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/common.py +0 -0
  118. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/documents.py +0 -0
  119. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/embeddings.py +0 -0
  120. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/feedback.py +0 -0
  121. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/feeds.py +0 -0
  122. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/jobs.py +0 -0
  123. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/orgs.py +0 -0
  124. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/pipelines.py +0 -0
  125. {knowledge2-0.4.1 → knowledge2-0.5.0}/models/usage.py +0 -0
  126. {knowledge2-0.4.1 → knowledge2-0.5.0}/py.typed +0 -0
  127. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/_mixin_base.py +0 -0
  128. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/a2a.py +0 -0
  129. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/agents.py +0 -0
  130. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/audit.py +0 -0
  131. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/auth.py +0 -0
  132. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/console.py +0 -0
  133. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/documents.py +0 -0
  134. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/feeds.py +0 -0
  135. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/jobs.py +0 -0
  136. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/metadata.py +0 -0
  137. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/orgs.py +0 -0
  138. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/pipeline_builder.py +0 -0
  139. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/pipelines.py +0 -0
  140. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/projects.py +0 -0
  141. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/search.py +0 -0
  142. {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/usage.py +0 -0
  143. {knowledge2-0.4.1 → knowledge2-0.5.0}/setup.cfg +0 -0
  144. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/a2a.py +0 -0
  145. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/audit.py +0 -0
  146. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/auth.py +0 -0
  147. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/chunks.py +0 -0
  148. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/common.py +0 -0
  149. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/console.py +0 -0
  150. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/documents.py +0 -0
  151. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/embeddings.py +0 -0
  152. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/feedback.py +0 -0
  153. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/feeds.py +0 -0
  154. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/jobs.py +0 -0
  155. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/orgs.py +0 -0
  156. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/pipelines.py +0 -0
  157. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/search.py +0 -0
  158. {knowledge2-0.4.1 → knowledge2-0.5.0}/types/usage.py +0 -0
@@ -0,0 +1,5 @@
1
+ exclude AGENTS.md
2
+ exclude specification.md
3
+ recursive-exclude .claude *
4
+ recursive-exclude .codex *
5
+ recursive-exclude .skills *
@@ -0,0 +1,217 @@
1
+ Metadata-Version: 2.4
2
+ Name: knowledge2
3
+ Version: 0.5.0
4
+ Summary: Python SDK for the Knowledge2 retrieval platform
5
+ Author-email: Knowledge2 <contact@knowledge2.ai>
6
+ License: MIT
7
+ Project-URL: Homepage, https://knowledge2.ai
8
+ Project-URL: Documentation, https://knowledge2.ai/docs
9
+ Project-URL: Repository, https://github.com/knowledge2-ai/knowledge2-python-sdk
10
+ Project-URL: Changelog, https://github.com/knowledge2-ai/knowledge2-python-sdk/blob/main/CHANGELOG.md
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ Requires-Dist: httpx>=0.27
22
+ Provides-Extra: config
23
+ Requires-Dist: pydantic-settings>=2.0; extra == "config"
24
+ Provides-Extra: pydantic
25
+ Requires-Dist: pydantic>=2.0; extra == "pydantic"
26
+ Provides-Extra: yaml
27
+ Requires-Dist: pyyaml>=6.0; extra == "yaml"
28
+
29
+ # Knowledge2 Python SDK
30
+
31
+ [![PyPI version](https://img.shields.io/pypi/v/knowledge2.svg)](https://pypi.org/project/knowledge2/)
32
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
33
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
34
+
35
+ Official Python client for the Knowledge2 retrieval platform. The supported customer journey is:
36
+
37
+ `create corpus -> ingest documents -> build indexes -> search -> optimize retrieval`
38
+
39
+ ## Installation
40
+
41
+ From PyPI:
42
+
43
+ ```bash
44
+ pip install knowledge2
45
+ pip install "knowledge2[config]"
46
+ pip install "knowledge2[pydantic]"
47
+ pip install "knowledge2[yaml]"
48
+ ```
49
+
50
+ From source:
51
+
52
+ ```bash
53
+ pip install -e .
54
+ pip install -e ".[config]"
55
+ pip install -e ".[pydantic]"
56
+ pip install -e ".[yaml]"
57
+ ```
58
+
59
+ ## Surface Categories
60
+
61
+ | Category | Surface |
62
+ |---|---|
63
+ | Core retrieval workflow | orgs, auth, projects, corpora, documents, indexes, search, jobs, metadata, onboarding, audit, usage, console, generation models |
64
+ | Enterprise capabilities | agents, feeds, pipelines, A2A |
65
+
66
+ The main docs and examples below focus on the core retrieval workflow.
67
+
68
+ ## Quick Start
69
+
70
+ ```python
71
+ from sdk import Knowledge2
72
+
73
+ client = Knowledge2(api_key="k2_...")
74
+
75
+ project = client.create_project("My Project")
76
+ corpus = client.create_corpus(project["id"], "My Corpus")
77
+
78
+ client.upload_documents_batch(
79
+ corpus["id"],
80
+ [
81
+ {
82
+ "source_uri": "doc://overview",
83
+ "raw_text": "Knowledge2 builds dense and sparse indexes for hybrid retrieval.",
84
+ "metadata": {"topic": "overview"},
85
+ },
86
+ {
87
+ "source_uri": "doc://search",
88
+ "raw_text": "Hybrid retrieval combines semantic similarity with exact keyword matching.",
89
+ "metadata": {"topic": "search"},
90
+ },
91
+ ],
92
+ wait=True,
93
+ auto_index=False,
94
+ )
95
+ client.sync_indexes(corpus["id"], wait=True)
96
+
97
+ results = client.search(
98
+ corpus["id"],
99
+ "what is hybrid retrieval",
100
+ top_k=3,
101
+ return_config={"include_text": True, "include_scores": True},
102
+ )
103
+
104
+ for hit in results["results"]:
105
+ print(hit["score"], hit.get("text", "")[:80])
106
+ ```
107
+
108
+ ## Improve Retrieval Quality
109
+
110
+ ```python
111
+ profile = client.get_query_profile(corpus["id"])
112
+ print(profile["example_queries"])
113
+
114
+ job = client.optimize_indexes(
115
+ corpus["id"],
116
+ example_queries=[
117
+ "how does hybrid retrieval work",
118
+ "what is bm25 tuning",
119
+ "how does rrf combine dense and sparse search",
120
+ ],
121
+ query_count=25,
122
+ top_k=10,
123
+ metric="ndcg",
124
+ wait=False,
125
+ )
126
+ print(job["job_id"], job["job_type"])
127
+ ```
128
+
129
+ ## Examples
130
+
131
+ - `sdk/examples/retrieval_quickstart.py`: minimal happy path from empty corpus to working hybrid search
132
+ - `sdk/examples/e2e_lifecycle.py`: full retrieval-quality workflow with query profile inspection and `indexes:optimize`
133
+
134
+ Run either example with:
135
+
136
+ ```bash
137
+ export K2_BASE_URL=https://api.knowledge2.ai
138
+ export K2_API_KEY=<api-key>
139
+ python sdk/examples/retrieval_quickstart.py
140
+ python sdk/examples/e2e_lifecycle.py
141
+ ```
142
+
143
+ ## Authentication
144
+
145
+ | Method | Header | Typical use |
146
+ |---|---|---|
147
+ | API key | `X-API-Key` | primary programmatic access |
148
+ | Bearer token | `Authorization: Bearer <token>` | console / Auth0 session |
149
+ | Admin token | `X-Admin-Token` | bootstrap and admin operations |
150
+
151
+ ```python
152
+ client = Knowledge2(api_key="k2_...")
153
+ client = Knowledge2.from_env()
154
+ client = Knowledge2(bearer_token="...")
155
+ ```
156
+
157
+ ## Configuration
158
+
159
+ Important constructor knobs:
160
+
161
+ - `api_host`: defaults to `https://api.knowledge2.ai`
162
+ - `api_key`: API key for programmatic access
163
+ - `org_id`: auto-detected from `GET /v1/auth/whoami` when omitted
164
+ - `timeout`: float or `ClientTimeouts`
165
+ - `limits`: connection-pool settings via `ClientLimits`
166
+ - `max_retries`: transient retry budget
167
+ - `validate_responses`: enable Pydantic response validation
168
+ - `http_client`: bring your own `httpx.Client`
169
+
170
+ ```python
171
+ from sdk import ClientTimeouts, Knowledge2
172
+
173
+ client = Knowledge2(
174
+ api_key="k2_...",
175
+ timeout=ClientTimeouts(connect=5, read=120, write=30, pool=10),
176
+ )
177
+ ```
178
+
179
+ ## Namespaces
180
+
181
+ The flat client API is canonical. Namespace helpers group the same methods without changing behavior:
182
+
183
+ - `client.documents.*`
184
+ - `client.corpora.*`
185
+ - `client.search_ns.*`
186
+ - `client.jobs.*`
187
+ - `client.auth.*`
188
+
189
+ ## Framework Integrations
190
+
191
+ The SDK ships LangChain and LlamaIndex integration modules in-package. Install the framework dependency separately, then import the adapter:
192
+
193
+ ```python
194
+ from sdk.integrations.langchain import K2LangChainRetriever
195
+ from sdk.integrations.llamaindex import K2LlamaIndexRetriever
196
+ ```
197
+
198
+ ## Enterprise Capabilities
199
+
200
+ Agents, feeds, pipelines, and A2A are available for enterprise deployments. Keep the primary examples focused on the core retrieval flow.
201
+
202
+ ## Error Handling
203
+
204
+ All SDK exceptions inherit from `Knowledge2Error`.
205
+
206
+ ```python
207
+ from sdk.errors import Knowledge2Error, NotFoundError, RateLimitError
208
+
209
+ try:
210
+ client.get_corpus("missing")
211
+ except NotFoundError:
212
+ ...
213
+ except RateLimitError as exc:
214
+ print(exc.retry_after)
215
+ except Knowledge2Error as exc:
216
+ print(exc)
217
+ ```
@@ -0,0 +1,189 @@
1
+ # Knowledge2 Python SDK
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/knowledge2.svg)](https://pypi.org/project/knowledge2/)
4
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ Official Python client for the Knowledge2 retrieval platform. The supported customer journey is:
8
+
9
+ `create corpus -> ingest documents -> build indexes -> search -> optimize retrieval`
10
+
11
+ ## Installation
12
+
13
+ From PyPI:
14
+
15
+ ```bash
16
+ pip install knowledge2
17
+ pip install "knowledge2[config]"
18
+ pip install "knowledge2[pydantic]"
19
+ pip install "knowledge2[yaml]"
20
+ ```
21
+
22
+ From source:
23
+
24
+ ```bash
25
+ pip install -e .
26
+ pip install -e ".[config]"
27
+ pip install -e ".[pydantic]"
28
+ pip install -e ".[yaml]"
29
+ ```
30
+
31
+ ## Surface Categories
32
+
33
+ | Category | Surface |
34
+ |---|---|
35
+ | Core retrieval workflow | orgs, auth, projects, corpora, documents, indexes, search, jobs, metadata, onboarding, audit, usage, console, generation models |
36
+ | Enterprise capabilities | agents, feeds, pipelines, A2A |
37
+
38
+ The main docs and examples below focus on the core retrieval workflow.
39
+
40
+ ## Quick Start
41
+
42
+ ```python
43
+ from sdk import Knowledge2
44
+
45
+ client = Knowledge2(api_key="k2_...")
46
+
47
+ project = client.create_project("My Project")
48
+ corpus = client.create_corpus(project["id"], "My Corpus")
49
+
50
+ client.upload_documents_batch(
51
+ corpus["id"],
52
+ [
53
+ {
54
+ "source_uri": "doc://overview",
55
+ "raw_text": "Knowledge2 builds dense and sparse indexes for hybrid retrieval.",
56
+ "metadata": {"topic": "overview"},
57
+ },
58
+ {
59
+ "source_uri": "doc://search",
60
+ "raw_text": "Hybrid retrieval combines semantic similarity with exact keyword matching.",
61
+ "metadata": {"topic": "search"},
62
+ },
63
+ ],
64
+ wait=True,
65
+ auto_index=False,
66
+ )
67
+ client.sync_indexes(corpus["id"], wait=True)
68
+
69
+ results = client.search(
70
+ corpus["id"],
71
+ "what is hybrid retrieval",
72
+ top_k=3,
73
+ return_config={"include_text": True, "include_scores": True},
74
+ )
75
+
76
+ for hit in results["results"]:
77
+ print(hit["score"], hit.get("text", "")[:80])
78
+ ```
79
+
80
+ ## Improve Retrieval Quality
81
+
82
+ ```python
83
+ profile = client.get_query_profile(corpus["id"])
84
+ print(profile["example_queries"])
85
+
86
+ job = client.optimize_indexes(
87
+ corpus["id"],
88
+ example_queries=[
89
+ "how does hybrid retrieval work",
90
+ "what is bm25 tuning",
91
+ "how does rrf combine dense and sparse search",
92
+ ],
93
+ query_count=25,
94
+ top_k=10,
95
+ metric="ndcg",
96
+ wait=False,
97
+ )
98
+ print(job["job_id"], job["job_type"])
99
+ ```
100
+
101
+ ## Examples
102
+
103
+ - `sdk/examples/retrieval_quickstart.py`: minimal happy path from empty corpus to working hybrid search
104
+ - `sdk/examples/e2e_lifecycle.py`: full retrieval-quality workflow with query profile inspection and `indexes:optimize`
105
+
106
+ Run either example with:
107
+
108
+ ```bash
109
+ export K2_BASE_URL=https://api.knowledge2.ai
110
+ export K2_API_KEY=<api-key>
111
+ python sdk/examples/retrieval_quickstart.py
112
+ python sdk/examples/e2e_lifecycle.py
113
+ ```
114
+
115
+ ## Authentication
116
+
117
+ | Method | Header | Typical use |
118
+ |---|---|---|
119
+ | API key | `X-API-Key` | primary programmatic access |
120
+ | Bearer token | `Authorization: Bearer <token>` | console / Auth0 session |
121
+ | Admin token | `X-Admin-Token` | bootstrap and admin operations |
122
+
123
+ ```python
124
+ client = Knowledge2(api_key="k2_...")
125
+ client = Knowledge2.from_env()
126
+ client = Knowledge2(bearer_token="...")
127
+ ```
128
+
129
+ ## Configuration
130
+
131
+ Important constructor knobs:
132
+
133
+ - `api_host`: defaults to `https://api.knowledge2.ai`
134
+ - `api_key`: API key for programmatic access
135
+ - `org_id`: auto-detected from `GET /v1/auth/whoami` when omitted
136
+ - `timeout`: float or `ClientTimeouts`
137
+ - `limits`: connection-pool settings via `ClientLimits`
138
+ - `max_retries`: transient retry budget
139
+ - `validate_responses`: enable Pydantic response validation
140
+ - `http_client`: bring your own `httpx.Client`
141
+
142
+ ```python
143
+ from sdk import ClientTimeouts, Knowledge2
144
+
145
+ client = Knowledge2(
146
+ api_key="k2_...",
147
+ timeout=ClientTimeouts(connect=5, read=120, write=30, pool=10),
148
+ )
149
+ ```
150
+
151
+ ## Namespaces
152
+
153
+ The flat client API is canonical. Namespace helpers group the same methods without changing behavior:
154
+
155
+ - `client.documents.*`
156
+ - `client.corpora.*`
157
+ - `client.search_ns.*`
158
+ - `client.jobs.*`
159
+ - `client.auth.*`
160
+
161
+ ## Framework Integrations
162
+
163
+ The SDK ships LangChain and LlamaIndex integration modules in-package. Install the framework dependency separately, then import the adapter:
164
+
165
+ ```python
166
+ from sdk.integrations.langchain import K2LangChainRetriever
167
+ from sdk.integrations.llamaindex import K2LlamaIndexRetriever
168
+ ```
169
+
170
+ ## Enterprise Capabilities
171
+
172
+ Agents, feeds, pipelines, and A2A are available for enterprise deployments. Keep the primary examples focused on the core retrieval flow.
173
+
174
+ ## Error Handling
175
+
176
+ All SDK exceptions inherit from `Knowledge2Error`.
177
+
178
+ ```python
179
+ from sdk.errors import Knowledge2Error, NotFoundError, RateLimitError
180
+
181
+ try:
182
+ client.get_corpus("missing")
183
+ except NotFoundError:
184
+ ...
185
+ except RateLimitError as exc:
186
+ print(exc.retry_after)
187
+ except Knowledge2Error as exc:
188
+ print(exc)
189
+ ```
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for the SDK version string."""
2
2
 
3
- __version__ = "0.4.1"
3
+ __version__ = "0.5.0"
@@ -31,19 +31,17 @@ from sdk.async_resources import (
31
31
  AsyncAuthMixin,
32
32
  AsyncConsoleMixin,
33
33
  AsyncCorporaMixin,
34
- AsyncDeploymentsMixin,
35
34
  AsyncDocumentsMixin,
36
35
  AsyncFeedsMixin,
36
+ AsyncGenerationModelsMixin,
37
37
  AsyncIndexesMixin,
38
38
  AsyncJobsMixin,
39
39
  AsyncMetadataMixin,
40
- AsyncModelsMixin,
41
40
  AsyncOnboardingMixin,
42
41
  AsyncOrgsMixin,
43
42
  AsyncPipelinesMixin,
44
43
  AsyncProjectsMixin,
45
44
  AsyncSearchMixin,
46
- AsyncTrainingMixin,
47
45
  AsyncUsageMixin,
48
46
  )
49
47
 
@@ -61,13 +59,10 @@ class AsyncKnowledge2(
61
59
  AsyncAuthMixin,
62
60
  AsyncProjectsMixin,
63
61
  AsyncCorporaMixin,
64
- AsyncModelsMixin,
65
62
  AsyncDocumentsMixin,
66
63
  AsyncIndexesMixin,
67
64
  AsyncSearchMixin,
68
65
  AsyncMetadataMixin,
69
- AsyncTrainingMixin,
70
- AsyncDeploymentsMixin,
71
66
  AsyncJobsMixin,
72
67
  AsyncAuditMixin,
73
68
  AsyncUsageMixin,
@@ -75,6 +70,7 @@ class AsyncKnowledge2(
75
70
  AsyncOnboardingMixin,
76
71
  AsyncAgentsMixin,
77
72
  AsyncFeedsMixin,
73
+ AsyncGenerationModelsMixin,
78
74
  AsyncPipelinesMixin,
79
75
  AsyncA2AMixin,
80
76
  ):
@@ -6,19 +6,17 @@ from .audit import AsyncAuditMixin
6
6
  from .auth import AsyncAuthMixin
7
7
  from .console import AsyncConsoleMixin
8
8
  from .corpora import AsyncCorporaMixin
9
- from .deployments import AsyncDeploymentsMixin
10
9
  from .documents import AsyncDocumentsMixin
11
10
  from .feeds import AsyncFeedsMixin
11
+ from .generation_models import AsyncGenerationModelsMixin
12
12
  from .indexes import AsyncIndexesMixin
13
13
  from .jobs import AsyncJobsMixin
14
14
  from .metadata import AsyncMetadataMixin
15
- from .models import AsyncModelsMixin
16
15
  from .onboarding import AsyncOnboardingMixin
17
16
  from .orgs import AsyncOrgsMixin
18
17
  from .pipelines import AsyncPipelinesMixin
19
18
  from .projects import AsyncProjectsMixin
20
19
  from .search import AsyncSearchMixin
21
- from .training import AsyncTrainingMixin
22
20
  from .usage import AsyncUsageMixin
23
21
 
24
22
  __all__ = [
@@ -28,18 +26,16 @@ __all__ = [
28
26
  "AsyncAuthMixin",
29
27
  "AsyncConsoleMixin",
30
28
  "AsyncCorporaMixin",
31
- "AsyncDeploymentsMixin",
32
29
  "AsyncDocumentsMixin",
33
30
  "AsyncFeedsMixin",
31
+ "AsyncGenerationModelsMixin",
34
32
  "AsyncIndexesMixin",
35
33
  "AsyncJobsMixin",
36
34
  "AsyncMetadataMixin",
37
- "AsyncModelsMixin",
38
35
  "AsyncOnboardingMixin",
39
36
  "AsyncOrgsMixin",
40
37
  "AsyncPipelinesMixin",
41
38
  "AsyncProjectsMixin",
42
39
  "AsyncSearchMixin",
43
- "AsyncTrainingMixin",
44
40
  "AsyncUsageMixin",
45
41
  ]
@@ -145,7 +145,6 @@ class AsyncConsoleMixin(AsyncRequesterMixin):
145
145
  project_id: str,
146
146
  *,
147
147
  name: str | None = None,
148
- graph_rag_policy: dict[str, Any] | None = None,
149
148
  request_options: RequestOptions | None = None,
150
149
  ) -> ConsoleProjectItem:
151
150
  """Update a console project's settings.
@@ -153,7 +152,6 @@ class AsyncConsoleMixin(AsyncRequesterMixin):
153
152
  Args:
154
153
  project_id: Unique identifier of the project to update.
155
154
  name: New display name for the project.
156
- graph_rag_policy: Updated GraphRAG policy configuration.
157
155
 
158
156
  Returns:
159
157
  The updated project information.
@@ -166,8 +164,6 @@ class AsyncConsoleMixin(AsyncRequesterMixin):
166
164
  payload: dict[str, Any] = {}
167
165
  if name is not None:
168
166
  payload["name"] = name
169
- if graph_rag_policy is not None:
170
- payload["graph_rag_policy"] = graph_rag_policy
171
167
  data = await self._request(
172
168
  "PATCH",
173
169
  f"/v1/console/projects/{project_id}",
@@ -146,7 +146,6 @@ class AsyncCorporaMixin(AsyncRequesterMixin):
146
146
  name: str | None = None,
147
147
  description: str | None = None,
148
148
  chunking_config: dict[str, Any] | None = None,
149
- graph_rag_policy: dict[str, Any] | None = None,
150
149
  request_options: RequestOptions | None = None,
151
150
  ) -> CorpusResponse:
152
151
  """Update corpus settings.
@@ -157,8 +156,6 @@ class AsyncCorporaMixin(AsyncRequesterMixin):
157
156
  description: New description for the corpus. Pass an empty
158
157
  string to clear an existing description.
159
158
  chunking_config: Default chunking configuration for documents in this corpus.
160
- graph_rag_policy: Optional corpus-level GraphRAG defaults that override
161
- project-level settings when present.
162
159
 
163
160
  Returns:
164
161
  Updated corpus response
@@ -171,8 +168,6 @@ class AsyncCorporaMixin(AsyncRequesterMixin):
171
168
  payload["description"] = description
172
169
  if chunking_config is not None:
173
170
  payload["chunking_config"] = chunking_config
174
- if graph_rag_policy is not None:
175
- payload["graph_rag_policy"] = graph_rag_policy
176
171
  data = await self._request(
177
172
  "PATCH", f"/v1/corpora/{corpus_id}", json=payload, request_options=request_options
178
173
  )
@@ -218,60 +213,3 @@ class AsyncCorporaMixin(AsyncRequesterMixin):
218
213
  request_options=request_options,
219
214
  )
220
215
  return self._maybe_validate(data, "CorpusDeleteResponse")
221
-
222
- async def list_corpus_models(
223
- self,
224
- corpus_id: str,
225
- limit: int = 100,
226
- offset: int = 0,
227
- request_options: RequestOptions | None = None,
228
- ) -> Page[dict[str, Any]]:
229
- """List models associated with a corpus.
230
-
231
- Args:
232
- corpus_id: Unique identifier of the corpus.
233
- limit: Maximum number of models to return per page.
234
- offset: Number of models to skip for pagination.
235
-
236
- Returns:
237
- A Page containing model records for the corpus with pagination metadata.
238
-
239
- Raises:
240
- NotFoundError: If the corpus does not exist.
241
- Knowledge2Error: If the API request fails.
242
- """
243
- corpus_id = require_str(corpus_id, "corpus_id")
244
- return await self._list_page(
245
- "GET",
246
- f"/v1/corpora/{corpus_id}/models",
247
- items_key="models",
248
- limit=limit,
249
- offset=offset,
250
- )
251
-
252
- def iter_corpus_models(
253
- self,
254
- corpus_id: str,
255
- *,
256
- limit: int = 100,
257
- request_options: RequestOptions | None = None,
258
- ) -> AsyncPager[dict[str, Any]]:
259
- """Lazily paginate corpus models, yielding individual model items.
260
-
261
- Args:
262
- corpus_id: Unique identifier of the corpus.
263
- limit: Page size used for each underlying API request.
264
-
265
- Yields:
266
- Individual model dicts.
267
-
268
- Raises:
269
- Knowledge2Error: If any underlying API request fails.
270
- """
271
- corpus_id = require_str(corpus_id, "corpus_id")
272
- return self._paginate(
273
- "GET",
274
- f"/v1/corpora/{corpus_id}/models",
275
- items_key="models",
276
- limit=limit,
277
- )
@@ -0,0 +1,29 @@
1
+ """Async generation model resource mixin for the Knowledge2 SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from sdk._request_options import RequestOptions
6
+ from sdk.async_resources._mixin_base import AsyncRequesterMixin
7
+ from sdk.types import GenerationModelsListResponse
8
+
9
+
10
+ class AsyncGenerationModelsMixin(AsyncRequesterMixin):
11
+ async def list_generation_models(
12
+ self,
13
+ *,
14
+ request_options: RequestOptions | None = None,
15
+ ) -> GenerationModelsListResponse:
16
+ """List available generation models.
17
+
18
+ Returns:
19
+ A response containing the available generation models.
20
+
21
+ Raises:
22
+ Knowledge2Error: If the API request fails.
23
+ """
24
+ data = await self._request(
25
+ "GET",
26
+ "/v1/models/generation",
27
+ request_options=request_options,
28
+ )
29
+ return self._maybe_validate(data, "GenerationModelsListResponse")