You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bring the Python SDK to Node SDK 2.2.0 HTTP/type parity, then port the storage-first knowledge layer.
Node (@ontos-ai/knowhere-sdk)
Python (knowhere-python-sdk)
Published
2.2.0 (npm latest)
0.6.0 (PyPI)
Git main
2.2.0
unpublished 2.0.0
API line
/v2 only
/v2 only on main (PyPI 0.6.0 is still v1)
main already has v2 page-memory (#31) and BYOK llm_config (#33). That is Node 2.0.0 core + Node 2.2.0 BYOK. It does not yet cover Node 0.7.0–0.8.0 HTTP extras that still ship in 2.2.0 (document metadata, planned document_id on create, auth token provider) or Node 2.1.x knowledge/parsed-storage.
Chunk metadata stays Dict[str, Any]. Export PageCitationAsset so callers can parse chunk.metadata["pageAssets"] (Node pageCitationAssetsMetadataKey). Do not invent a second generation path; server descriptors only.
search omits use_agentic when unset so the API map-nav default applies; False forces classic. Do not change HTTP retrieval.query (already correct).
Acceptance
Local parse → outline / read / grep against committed files without a network chunk list.
Missing storage object falls back to remote document chunks and returns remote asset_urls.
Grep match includes page_numbers when the source chunk has them.
search(query=...) body has no use_agentic; search(..., use_agentic=False) sends false.
Implement against Node src/knowledge/ + src/storage/. Prefer a follow-up design note in the PR if a Python storage adapter must differ (sync vs async).
Non-goals
Reintroducing /v1 or an API version switcher.
Matching Node package version numbers 1:1 (Python 2.0.0 / 2.1.0 vs Node 2.2.0 is fine).
Porting @ontos-ai/knowhere-mcp / packages/mcp into this repo.
Regenerating page-citation assets in the SDK (Node already stopped doing that).
Summary
Bring the Python SDK to Node SDK 2.2.0 HTTP/type parity, then port the storage-first knowledge layer.
@ontos-ai/knowhere-sdk)knowhere-python-sdk)latest)main/v2only/v2only onmain(PyPI 0.6.0 is still v1)mainalready has v2 page-memory (#31) and BYOKllm_config(#33). That is Node 2.0.0 core + Node 2.2.0 BYOK. It does not yet cover Node 0.7.0–0.8.0 HTTP extras that still ship in 2.2.0 (document metadata, planneddocument_idon create, auth token provider) or Node 2.1.x knowledge/parsed-storage.Already on
main— do not redollm_configon parse, job create, and retrieval query (feat: support llm_config BYOK on jobs and retrieval #33)retrieval.queryomitsuse_agenticwhenNone(server map-nav default). Node 2.2.0’s omit change isknowledge.search, not HTTP retrieval.asset_url/include_asset_urlson document chunksContract
Port from Node
mainat tagv2.2.0. Python stays snake_case on the wire and in public APIs (document_metadata, notdocumentMetadata).Node sources of truth:
src/resources/jobs.ts,src/lib/document-metadata.ts,src/types/params.ts,src/types/job.tssrc/resources/documents.ts,src/types/document.ts,src/types/page-citation-assets.tssrc/client.ts,src/lib/http-client.ts,src/types/client.tssrc/knowledge/knowledge.ts,src/knowledge/types.ts,src/types/storage.ts,src/storage/parsed-document-storage.tsP0 — HTTP / type parity
Ship as 2.1.0 after publishing 2.0.0 (see rollout). Split into the PRs below so each is reviewable.
PR A — Publish 2.0.0
No code. Merge #32 so PyPI matches
main(v2 + BYOK). Do not wait for the rest of P0.PR B — Document metadata + telemetry + planned
document_idRequest
document_metadata: Optional[Dict[str, Any]]onjobs.create(sync + async) and forward it fromKnowhere.parse/AsyncKnowhere.parse.{"created_by_client": "python-sdk", "client_version": __version__, **(document_metadata or {})}Caller keys win. Defaults only fill missing keys (Node
mergeDocumentMetadataDefaults).Response
document_id: Optional[str] = NoneonJob(create response).JobResultalready has it.document_metadata: Optional[Dict[str, Any]] = NoneonDocument.document_id(tests/test_jobs.py,tests/test_models.py).Files
src/knowhere/types/params.py—DocumentMetadataaliassrc/knowhere/lib/document_metadata.py— defaults + merge helper (mirror Node)src/knowhere/types/job.py,src/knowhere/types/document.pysrc/knowhere/resources/jobs.py,src/knowhere/_client.pysrc/knowhere/__init__.py— export helper + typetests/test_jobs.py,tests/test_documents.py,tests/test_models.py,tests/test_parse.pydocs/usage.md,README.mdAcceptance
created_by_client=python-sdkandclient_version.{created_by_client: "cli"}→ that key is"cli";client_versionstill defaulted.document_idparses ontoJob.document_id.documents.get/ list parsedocument_metadatawhen present.PR C — Page citation source + typed assets
HTTP
Documents.get_page_citation_source(document_id) -> DocumentPageCitationSourceGET /v2/documents/{document_id}/files/page-citation-sourceTypes (match Node; snake_case)
Chunk
metadatastaysDict[str, Any]. ExportPageCitationAssetso callers can parsechunk.metadata["pageAssets"](NodepageCitationAssetsMetadataKey). Do not invent a second generation path; server descriptors only.Files
src/knowhere/types/document.py,src/knowhere/types/page_citation.py(or colocated)src/knowhere/resources/documents.pysrc/knowhere/__init__.pytests/test_documents.pydocs/usage.mdAcceptance
NotFoundError.PR D —
auth_token_providerMirror Node: exactly one of
api_key(arg orKNOWHERE_API_KEY) orauth_token_provider. Ifapi_keyis set, ignore the provider.Knowhere:auth_token_provider: Optional[Callable[[], str]] = NoneAsyncKnowhere:Optional[Callable[[], Union[str, Awaitable[str]]]] = NoneAuthorization: Bearer …. Empty/None token →ValidationError.src/knowhere/_base_client.py). Change that guard.Files
src/knowhere/_base_client.py,src/knowhere/_client.pyif signatures need documentingtests/test_client.py(and retry tests if they assume a frozen Authorization header)docs/usage.mdAuthentication sectionAcceptance
Knowhere(auth_token_provider=lambda: "jwt")authenticates; noapi_keyrequired.ValidationError.api_key="sk_…"plus a provider uses the static key.P1 — Knowledge / parsed-storage (Node 2.1.1–2.2.0)
New
client.knowledgemodule. Contract is Node 2.1.2+ (result-relative objects, not old paged snapshots). MCP stays Node-only.Use these Python names (Node in parentheses):
parse_to_local_cacheparseToLocalCacheimport_job_resultimportJobResultload_job_resultloadJobResultwith_parsed_storagewithParsedStoragesync_parsed_documentsyncParsedDocumentread_chunksreadChunksgrep_chunksgrepChunksget_document_outlinegetDocumentOutlinesearchsearchStorage
manifest.json,chunks.json, optional sidecars, assets, plus a commit marker.read_object/write_object/ optionalhead_object,get_object_url) per NodeParsedDocumentStorage.Reads
read_chunks/grep_chunks/get_document_outlinewith remote fallback.grep_chunkscopies source-chunkpage_numbersonto matches (Node 2.2.0).searchomitsuse_agenticwhen unset so the API map-nav default applies;Falseforces classic. Do not change HTTPretrieval.query(already correct).Acceptance
asset_urls.page_numberswhen the source chunk has them.search(query=...)body has nouse_agentic;search(..., use_agentic=False)sendsfalse.Implement against Node
src/knowledge/+src/storage/. Prefer a follow-up design note in the PR if a Python storage adapter must differ (sync vs async).Non-goals
/v1or an API version switcher.@ontos-ai/knowhere-mcp/packages/mcpinto this repo.retrieval.queryuse_agenticomit behavior.Suggested rollout
Each PR: tests +
docs/usage.md/README.md/ examples when public API changes. FollowCONTRIBUTING.md(ruff,mypy,pytest).References
llmConfig(already in Python feat: support llm_config BYOK on jobs and retrieval #33), greppageNumbers, omit unsetuseAgenticinknowledge.search,created_by_client/client_versionmain: Add v2 page-memory schema support #31 v2 page-memory, feat: support llm_config BYOK on jobs and retrieval #33 BYOKllm_config, release: 2.0.0 #32 unpublished 2.0.0 release