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.
- knowledge2-0.5.0/MANIFEST.in +5 -0
- knowledge2-0.5.0/PKG-INFO +217 -0
- knowledge2-0.5.0/README.md +189 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_version.py +1 -1
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_client.py +2 -6
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/__init__.py +2 -6
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/console.py +0 -4
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/corpora.py +0 -62
- knowledge2-0.5.0/async_resources/generation_models.py +29 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/indexes.py +46 -2
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/onboarding.py +16 -11
- {knowledge2-0.4.1 → knowledge2-0.5.0}/client.py +2 -34
- knowledge2-0.5.0/examples/e2e_lifecycle.py +178 -0
- knowledge2-0.5.0/examples/retrieval_quickstart.py +58 -0
- knowledge2-0.5.0/knowledge2.egg-info/PKG-INFO +217 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/SOURCES.txt +11 -30
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/_registry.py +19 -48
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/agents.py +34 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/console.py +0 -3
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/corpora.py +1 -6
- knowledge2-0.5.0/models/generation_models.py +16 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/indexes.py +5 -2
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/onboarding.py +13 -5
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/projects.py +0 -3
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/search.py +1 -34
- {knowledge2-0.4.1 → knowledge2-0.5.0}/namespaces.py +0 -109
- {knowledge2-0.4.1 → knowledge2-0.5.0}/pyproject.toml +1 -1
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/__init__.py +2 -6
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/corpora.py +0 -57
- knowledge2-0.5.0/resources/generation_models.py +29 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/indexes.py +51 -2
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/onboarding.py +16 -12
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/__init__.py +12 -32
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/agents.py +48 -1
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/corpora.py +0 -1
- knowledge2-0.5.0/types/generation_models.py +14 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/indexes.py +6 -1
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/onboarding.py +13 -5
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/projects.py +0 -1
- knowledge2-0.4.1/AGENTS.md +0 -31
- knowledge2-0.4.1/PKG-INFO +0 -662
- knowledge2-0.4.1/README.md +0 -634
- knowledge2-0.4.1/async_resources/deployments.py +0 -106
- knowledge2-0.4.1/async_resources/models.py +0 -102
- knowledge2-0.4.1/async_resources/training.py +0 -357
- knowledge2-0.4.1/examples/e2e_lifecycle.py +0 -213
- knowledge2-0.4.1/knowledge2.egg-info/PKG-INFO +0 -662
- knowledge2-0.4.1/models/deployments.py +0 -13
- knowledge2-0.4.1/models/evaluation.py +0 -17
- knowledge2-0.4.1/models/models.py +0 -26
- knowledge2-0.4.1/models/training.py +0 -57
- knowledge2-0.4.1/resources/deployments.py +0 -105
- knowledge2-0.4.1/resources/models.py +0 -99
- knowledge2-0.4.1/resources/training.py +0 -358
- knowledge2-0.4.1/specification.md +0 -129
- knowledge2-0.4.1/types/deployments.py +0 -11
- knowledge2-0.4.1/types/evaluation.py +0 -15
- knowledge2-0.4.1/types/models.py +0 -22
- knowledge2-0.4.1/types/training.py +0 -55
- {knowledge2-0.4.1 → knowledge2-0.5.0}/.github/workflows/pypi-release.yml +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/CHANGELOG.md +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/__init__.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_async_base.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_async_paging.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_base.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_logging.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_paging.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_preview.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_raw_response.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_request_options.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_transport.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_validation.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/_validation_response.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/_mixin_base.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/a2a.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/agents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/audit.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/auth.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/documents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/feeds.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/jobs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/metadata.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/orgs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/pipelines.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/projects.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/search.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/async_resources/usage.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/config.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/errors.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/auth_factory.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/batch_operations.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/document_upload.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/error_handling.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/pagination.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/quickstart.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/request_options.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/examples/search.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/__init__.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/_client.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/__init__.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/retriever.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/langchain/tools.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/__init__.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/filters.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/retriever.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/tools.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/integrations/llamaindex/vector_store.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/dependency_links.txt +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/requires.txt +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/knowledge2.egg-info/top_level.txt +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/__init__.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/_base.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/a2a.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/audit.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/auth.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/chunks.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/common.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/documents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/embeddings.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/feedback.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/feeds.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/jobs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/orgs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/pipelines.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/models/usage.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/py.typed +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/_mixin_base.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/a2a.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/agents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/audit.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/auth.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/console.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/documents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/feeds.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/jobs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/metadata.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/orgs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/pipeline_builder.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/pipelines.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/projects.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/search.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/resources/usage.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/setup.cfg +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/a2a.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/audit.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/auth.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/chunks.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/common.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/console.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/documents.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/embeddings.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/feedback.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/feeds.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/jobs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/orgs.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/pipelines.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/search.py +0 -0
- {knowledge2-0.4.1 → knowledge2-0.5.0}/types/usage.py +0 -0
|
@@ -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
|
+
[](https://pypi.org/project/knowledge2/)
|
|
32
|
+
[](https://www.python.org/downloads/)
|
|
33
|
+
[](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
|
+
[](https://pypi.org/project/knowledge2/)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](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
|
+
```
|
|
@@ -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")
|