Catalog PyPI
Back to packageRELEASE DETAILS

0.2.0

PyPI

AI-Knowledge-Engineer

Local-first, multimodal knowledge ingestion engine that transforms heterogeneous data into structured, evidence-backed knowledge and portable second-brain vaults.

evidenceextractioningestionknowledge-managementlocal-firstprovenance
Published3 Sept 2026
Direct dependencies28
Transitive dependenciesNot calculated

README

Version 0.2.0 documentation

knowledge-engineer

Local-first, multimodal knowledge ingestion and extraction framework.

The engine walks a directory of source files, extracts structured artifacts (PDF, DOCX, PPTX, XLSX, CSV, JSON, HTML, Markdown, plain text, images, audio, video), runs knowledge extraction with a local LLM, deduplicates and detects contradictions, and writes the result as a Markdown vault (Obsidian-compatible) plus a JSON dump.

Domain lives in profiles — the same engine powers a personal archive, a software repository, or a research corpus. v0.1 ships generic, personal, software, and research profiles.

What it is not

  • It is not an Obsidian plugin. It exports an Obsidian-compatible vault, but the engine itself is a standalone CLI + REST API.
  • It is not a personal-life tool by default. Personal archival is one of four profiles; the engine is domain-independent.
  • It is not a cloud service. v0.1 runs entirely on local files. Cloud providers are documented as a future extension point.
  • It is not magic. It cannot extract knowledge from files it cannot read; OCR requires a real OCR provider; vision captioning requires a real vision provider. Providers that are not configured fail with ProviderNotConfiguredError — they never silently fabricate output.

Installation

Requires Python 3.11+.

python -m venv .venv
. .venv/bin/activate
pip install -e ".[dev]"

Optional OCR / vision / transcription dependencies are NOT bundled:

# OCR
brew install tesseract        # macOS
pip install pytesseract

# Vision
pip install clip-onnx         # future provider; v0.1 ships null only

# Transcription
pip install faster-whisper

Quick start

# 1. Initialize a project skeleton
knowledge-engineer init ./my-project

# 2. Scan a directory into the SQLite inventory
knowledge-engineer scan ./my-project/sample-data --db ./my-project/data/knowledge.db

# 3. Run the pipeline (discovery -> classify -> extract -> knowledge -> vault)
knowledge-engineer process \
    --db ./my-project/data/knowledge.db \
    --profile generic \
    --vault ./my-project/vault \
    --output-format markdown

# 4. Inspect
knowledge-engineer status --db ./my-project/data/knowledge.db
knowledge-engineer review  --db ./my-project/data/knowledge.db

# 5. Export
knowledge-engineer export \
    --db ./my-project/data/knowledge.db \
    --vault ./my-project/vault \
    --format obsidian   # or markdown | json

What it does on a corpus

The pipeline runs these stages per source file:

  1. DISCOVER — recursive walk, sha256 + MIME detection, symlink guards, archive-bomb limits.
  2. CLASSIFY — MIME → PipelineKind (document / image / audio / video / structured / text / archive / skip).
  3. EXTRACT — type-specific extractors produce a normalised Artifact (DocumentArtifact, ImageArtifact, etc.).
  4. NORMALIZE — text encoding, length caps, language hints.
  5. ENTITY_EXTRACTION — LLM extracts typed entities via temperature=0 structured output, schema-validated.
  6. CLAIM_EXTRACTION — same, claims (subject, predicate, object, evidence).
  7. RELATIONSHIP_EXTRACTION — typed relationships between entities.
  8. EVENT_EXTRACTION — dated occurrences.
  9. VALIDATION — claims without evidence are queued for review.
  10. PROVENANCE — every record tracks the source + artifact + the extractor version that produced it.
  11. STORE — SQLite persistence (WAL, foreign keys, busy timeout).
  12. EXPORT — Markdown, Obsidian-compatible, or JSON.

Each stage records its outcome in processing(source_id, stage) so the pipeline is resumable and auditable.

Provider model

Each capability has an interface:

CapabilityInterfacev0.1 defaultTo enable
LLMproviders.llm.LLMProviderOllama (real)pip install ollama + start daemon
OCRproviders.ocr.OCRProviderNullProviderpip install pytesseract + brew install tesseract
Visionproviders.vision.VisionProviderNullProviderfuture: clip-onnx, ollama-vision
Transcriptionproviders.transcription.TranscriptionNullProviderpip install faster-whisper + model
Embeddingsproviders.embeddings.EmbeddingsNullProviderfuture: sentence-transformers

Null providers raise ProviderNotConfiguredError when asked to do work. This is the framework's honesty contract.

Documentation

License

MIT. See LICENSE.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 28

Native requirements
28 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pydantic<3,>=2.9runtime
click
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
click>=8.1runtime
pyyaml
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pyyaml>=6.0runtime
jsonschema
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
jsonschema>=4.23runtime
markdown
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
markdown>=3.7runtime
httpx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
httpx>=0.27runtime
pypdf
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pypdf>=5.0runtime
python-docx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
python-docx>=1.1runtime
python-pptx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
python-pptx>=1.0runtime
openpyxl
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
openpyxl>=3.1runtime
pillow
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pillow>=10.0runtime
mutagen
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
mutagen>=1.47runtime
fastapi
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
fastapi>=0.115runtime
uvicorn
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
uvicorn>=0.32runtime
python-multipart
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
python-multipart>=0.0.12runtime
rapidfuzz
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
rapidfuzz>=3.14runtime
networkx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
networkx>=3.0runtime
python-louvain
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
python-louvain>=0.16runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest>=8.3; extra == "dev"runtime
pytest-asyncio
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest-asyncio>=0.24; extra == "dev"runtime
ruff
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
ruff>=0.8; extra == "dev"runtime
mypy
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
mypy>=1.13; extra == "dev"runtime
bandit
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
bandit>=1.8; extra == "dev"runtime
types-PyYAML
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
types-PyYAML; extra == "dev"runtime
types-openpyxl
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
types-openpyxl; extra == "dev"runtime
openai
Environment
{
  "extras": "",
  "marker": "extra == \"providers-cloud\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
openai>=1.40; extra == "providers-cloud"runtime
anthropic
Environment
{
  "extras": "",
  "marker": "extra == \"providers-cloud\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
anthropic>=0.34; extra == "providers-cloud"runtime
neo4j
Environment
{
  "extras": "",
  "marker": "extra == \"providers-graph\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
neo4j<6,>=5.20; extra == "providers-graph"runtime

Distribution files

2 collected
ai_knowledge_engineer-0.2.0-py3-none-any.whl

bdist_wheel · 245.2 KB · Python py3

Source file
ai_knowledge_engineer-0.2.0.tar.gz

sdist · 187.57 KB · Python source

Source file

Repository

PENDING
saoudhaidar/knowledge-engineer

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 11:07 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:3935a30538bf1f8b4fd5cd2beb06739b425f0f27b376669bf6d54948e45e2c95

Other collected versions

View all collected versions →