Observed since 21 Oct, 11:07 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AI-Knowledge-Engineer
Local-first, multimodal knowledge ingestion engine that transforms heterogeneous data into structured, evidence-backed knowledge and portable second-brain vaults.
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.
ProviderNotConfiguredError — they never silently fabricate output.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
# 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
The pipeline runs these stages per source file:
Each stage records its outcome in processing(source_id, stage) so the
pipeline is resumable and auditable.
Each capability has an interface:
| Capability | Interface | v0.1 default | To enable |
|---|---|---|---|
| LLM | providers.llm.LLMProvider | Ollama (real) | pip install ollama + start daemon |
| OCR | providers.ocr.OCRProvider | NullProvider | pip install pytesseract + brew install tesseract |
| Vision | providers.vision.VisionProvider | NullProvider | future: clip-onnx, ollama-vision |
| Transcription | providers.transcription.Transcription | NullProvider | pip install faster-whisper + model |
| Embeddings | providers.embeddings.Embeddings | NullProvider | future: sentence-transformers |
Null providers raise ProviderNotConfiguredError when asked to do work.
This is the framework's honesty contract.
MIT. See LICENSE.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pydantic<3,>=2.9 | runtime |
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | click>=8.1 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0 | runtime |
jsonschemaEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | jsonschema>=4.23 | runtime |
markdownEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | markdown>=3.7 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27 | runtime |
pypdfEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pypdf>=5.0 | runtime |
python-docxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-docx>=1.1 | runtime |
python-pptxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-pptx>=1.0 | runtime |
openpyxlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | openpyxl>=3.1 | runtime |
pillowEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pillow>=10.0 | runtime |
mutagenEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mutagen>=1.47 | runtime |
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | fastapi>=0.115 | runtime |
uvicornEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | uvicorn>=0.32 | runtime |
python-multipartEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-multipart>=0.0.12 | runtime |
rapidfuzzEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | rapidfuzz>=3.14 | runtime |
networkxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | networkx>=3.0 | runtime |
python-louvainEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-louvain>=0.16 | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest>=8.3; extra == "dev" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.24; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.8; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.13; extra == "dev" | runtime |
banditEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | bandit>=1.8; extra == "dev" | runtime |
types-PyYAMLEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | types-PyYAML; extra == "dev" | runtime |
types-openpyxlEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | types-openpyxl; extra == "dev" | runtime |
openaiEnvironment{
"extras": "",
"marker": "extra == \"providers-cloud\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | openai>=1.40; extra == "providers-cloud" | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"providers-cloud\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.34; extra == "providers-cloud" | runtime |
neo4jEnvironment{
"extras": "",
"marker": "extra == \"providers-graph\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | neo4j<6,>=5.20; extra == "providers-graph" | runtime |
bdist_wheel · 245.2 KB · Python py3
sdist · 187.57 KB · Python source
Shared repository data · GitHub
Observed since 21 Oct, 11:07 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:3935a30538bf1f8b4fd5cd2beb06739b425f0f27b376669bf6d54948e45e2c95