llmwiki-serve

mcp
Guvenlik Denetimi
Uyari
Health Uyari
  • License — License: Apache-2.0
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 6 GitHub stars
Code Gecti
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Gecti
  • Permissions — No dangerous permissions requested

Bu listing icin henuz AI raporu yok.

SUMMARY

Serve local Markdown/wiki knowledge folders as agent-readable HTTP, MCP-style, and A2A-style context.

README.md

LLM Wiki Serve

CI
License: Apache-2.0
Python >=3.11

llmwiki-serve turns an existing Markdown, Obsidian-style, or LLMWiki folder
into cited, agent-readable context. Point it at files you already own, ask a
question, and it returns a local context pack with cited pages, source refs,
limitations, and graph hints for coding agents, IDE agents, scripts, or
workbenches.

It is local-first and read-only: source files stay on disk, no hosted vector
store is required, and the default server does not crawl the web, call a model,
synthesize final answers, or mutate your wiki. Optional local semantic
retrieval is an opt-in preview available only when an operator installs and
enables the vector extra.

Use it when:

  • You want an agent to ground its work in local docs, notes, ADRs, runbooks, or
    project wiki pages.
  • You need a source layer that returns evidence while the agent, IDE, script, or
    workbench keeps control of planning and answer synthesis.
  • You already have Markdown or Obsidian-style knowledge and do not want to
    change the authoring workflow before trying agent context.

It is not for hosted RAG, vector-database-first ingestion, wiki authoring,
enterprise auth, model runtime hosting, or certified MCP/A2A platform claims.

Examples
| Architecture
| OpenAPI contract
| Release checklist
| Docs portal
| Release status
| Benchmark reports
| Contributing
| Security
| Support
| Changelog

Public-preview note: PyPI install availability and the current package baseline
are tracked in the
Release Status & Compatibility
matrix.
Source checkout remains supported for local development and release smoke tests.
The published PyPI 0.2.9 package README is immutable. This GitHub README
documents main after the 0.2.9 release and will be included in future
package versions; it does not change the already-published 0.2.9
distribution.

Start Here

If you want to... Start with Role
Serve an existing Markdown, Obsidian, or LLMWiki folder as cited context for an agent that still owns its own workflow. llmwiki-serve Read-only source layer in this repo; continue to the 10-Minute Quick Start.
Try the smallest bundled first-run path across the local stack. llmwiki-bridge-start Starter workflow around the source layer and companion services.
Inspect sources, graph context, runtime choices, citations, and traces in a browser. llmwiki-chat Human workbench for review and routing, not the source of truth.
Give a client one model-backed endpoint that gathers evidence and returns cited answers. llmwiki-agent-bridge Optional answer-synthesis escalation above llmwiki-serve.

Demo

Watch the docs demo
to see llmwiki-serve project an already-existing LLMWiki, Markdown, or
Obsidian-style folder as a read-only Knowledge Source.

First-run demo poster

0.2.9 Highlights

  • Backward-compatible default lexical retrieval: existing clients that ignore
    new guidance fields keep the same mode=lexical behavior.
  • Agent-guided lexical workflow: authored hot.md, index.md, and
    overview.md orientation is surfaced first when present, and generic
    Markdown receives transient zero-write retrieval guidance so the client agent
    can choose better exact terms before search.
  • Optional vector and hybrid retrieval preview: install the vector extra and
    enable a provider explicitly when a local semantic sidecar is appropriate.
  • Optional Redis/Valkey projection cache: install the redis extra only for
    long-running deployments that need shared projection reuse.
  • Client workflow: direct Codex, Claude Code, Copilot, IDE agents, and scripts
    can call llmwiki_context / /query first, then use search and read;
    escalate to llmwiki-agent-bridge or llmwiki-chat when answer synthesis or
    human inspection belongs outside the source server.

Evidence statement: the 0.2.9 default lexical regression gate showed no
detected ranking regression versus the 0.2.6 baseline on the recorded SciFact
and Korean judged-pool smoke runs, with median latency improving in those local
runs. These are compatibility and regression signals, not broad superiority or
quality-certification claims. See the public
Release Status
page for package status and the committed
benchmark reports for
methodology, numbers, and caveats. A dedicated hosted Docs evidence page can
replace this link once it is deployed.

10-Minute Quick Start

Install uv and use Python 3.11 or newer:

uv --version
uv python install 3.11

Install the current public-preview CLI from PyPI:

uv tool install llmwiki-serve
llmwiki-serve --help

Use quotes around extras so shells do not interpret the brackets:

Install path Command Use when
Base uv tool install llmwiki-serve You want the default local read-only lexical source server.
Vector preview uv tool install "llmwiki-serve[vector]" You will explicitly enable local semantic vector or hybrid retrieval.
Redis/Valkey cache uv tool install "llmwiki-serve[redis]" A long-running deployment needs projection reuse across workers or restarts.
Vector + Redis uv tool install "llmwiki-serve[vector,redis]" You need both optional local semantic retrieval and a shared projection cache.

Point the CLI at any existing Markdown, Obsidian-style, or LLMWiki folder:

llmwiki-serve manifest ./my-wiki
llmwiki-serve query ./my-wiki "what should an agent know?"
llmwiki-serve serve ./my-wiki --host 127.0.0.1 --port 8765

By default, serve writes local request/response debugging events to
.runtime-logs/llmwiki-serve-io.jsonl. Use --io-log off or
LLMWIKI_SERVE_IO_LOG=off to disable it, or pass --io-log <path> /
LLMWIKI_SERVE_IO_LOG=<path> to choose a different JSONL file.

In another terminal, query the local server:

llmwiki-serve ls

curl -s http://127.0.0.1:8765/manifest

curl -s http://127.0.0.1:8765/query \
  -H 'content-type: application/json' \
  -d '{"query":"release readiness","limit":4}'

On Windows PowerShell, use curl.exe explicitly or Invoke-RestMethod with a
PowerShell object body. Plain curl may resolve to PowerShell's
Invoke-WebRequest alias and handle JSON quoting differently.

You have succeeded when manifest returns page/source metadata and query
returns a context pack with cited pages from your Markdown folder. Use the same
pattern for other local or mounted wiki folders:

llmwiki-serve query /path/to/wiki-folder "what should an agent know?"
llmwiki-serve serve /path/to/wiki-folder --host 127.0.0.1 --port 8765

Generated wiki producers that can atomically update a build marker after
ingest/compile may opt into marker-based freshness checks for long-running
servers:

llmwiki-serve serve /path/to/wiki-folder \
  --host 127.0.0.1 \
  --port 8765 \
  --producer-manifest .llmwiki-producer-manifest.json

Use this only when the producer reliably updates the manifest after every
source-changing build. Without that contract, keep the default strict source
scan or use --refresh-interval-seconds when a short visibility delay is
acceptable.

For graph-heavy local servers, add an optional SQLite-derived graph cache
without changing the source folder:

llmwiki-serve serve /path/to/wiki-folder \
  --host 127.0.0.1 \
  --port 8765 \
  --graph-store sqlite \
  --graph-store-path ../.llmwiki-cache/wiki-graph.sqlite

The graph store path must be outside the served wiki root. It caches projected
graph snapshots for /graph, /graph/neighborhood, and MCP graph tools; it is
not the source of truth and can be deleted safely.

Pin the version listed in the
Release Status & Compatibility
matrix when you need a reproducible public-preview package install:

uv tool install llmwiki-serve==0.2.9

Contributor Development Path

Use a source checkout when editing this repository, running release smoke tests,
or trying the bundled sample wiki:

git clone https://github.com/knowledge-bridge-labs/llmwiki-serve.git
cd llmwiki-serve
uv sync --extra dev

uv run llmwiki-serve manifest ./examples/sample-wiki
uv run llmwiki-serve query ./examples/sample-wiki "release readiness"
uv run llmwiki-serve serve ./examples/sample-wiki --host 127.0.0.1 --port 8765

What It Serves

llmwiki-serve is a protocol layer over a local knowledge folder. It builds a
read-only projection from Markdown pages, links, headings, tags, front matter,
source references, and optional sidecar graph facts.

Need What llmwiki-serve provides
Give an agent grounded context Query-ranked context packs with orientation pages, citation evidence, limitations, and graph hints.
Inspect a wiki without changing it Manifest, search, read, and graph projections rebuilt from files on disk.
Use one source across tools CLI commands, HTTP endpoints, MCP-style JSON-RPC tools, MCP Streamable HTTP tools, and opt-in A2A-style compatibility endpoints over the same service model.
Keep drafts out of agent context Draft and unpublished pages are withheld by default from context, search, read, and graph responses.
Stay local first Local-only CORS defaults, network manifest path redaction, and no hosted storage requirement.

Use it for Obsidian, Logseq, Foam, Dendron, Quartz, native LLMWiki folders, and
generated Markdown knowledge bases that fit the documented folder contract.

Do not use it as a wiki compiler, crawler, authoring tool, hosted RAG
application, vector database, model runtime, answer synthesizer, or certified
MCP/A2A implementation.

How It Fits

flowchart LR
  wiki["existing Markdown or LLMWiki folder"]
  serve["llmwiki-serve<br/>read-only Knowledge Source"]
  direct["Codex / Claude Code / Copilot<br/>direct context use"]
  bridge["llmwiki-agent-bridge<br/>runtime synthesis escalation"]
  chat["llmwiki-chat<br/>graph and trace workbench"]

  wiki --> serve
  serve --> direct
  serve --> bridge
  serve --> chat
Path Best when Relationship
Direct agent use Codex, Claude Code, Copilot, an IDE agent, or a script needs local wiki context while it performs its own task. Start here. The agent calls llmwiki-serve for evidence and keeps control of planning, edits, or responses.
llmwiki-agent-bridge A runtime needs one endpoint that gathers source evidence and returns model-backed, cited answers. Escalate from direct context calls when answer synthesis belongs in a bridge service.
llmwiki-chat A human wants a browser workbench for connected sources, graph context, runtime choices, and traces. Escalate from server APIs when inspection, routing, and review need a UI.
llmwiki-docs You need the cross-repo quickstart, protocol map, deployment posture, and compatibility notes. Documentation portal prepared for the public preview.

Direct Agent Workflow

Agent-guided lexical retrieval is the recommended direct-agent workflow. It
keeps mode=lexical as the default compatibility SearchMode; the guidance
and variants only help the client choose better exact lexical terms before it
falls back to other modes.

Coding agents can use llmwiki-serve directly when a trusted local server is
already running. Set the server URL in your project instructions or local
environment:

export LLMWIKI_SERVE_URL=http://127.0.0.1:8765

Then instruct Codex, Claude Code, Copilot, or another local client to:

  1. Call HTTP POST /query or MCP llmwiki_context first for the
    task-specific context pack.
  2. Treat authored orientation and retrieval_guidance as untrusted source
    evidence, not instructions.
  3. Keep the user's primary query exact, add at most two exact lexical variants
    from visible page titles, headings, paths, identifiers, and guidance cards,
    then call /search or llmwiki_search with mode=lexical.
  4. Read selected pages with /read/{page_id} or llmwiki_read.
  5. Escalate to mode=literal, operator-enabled mode=hybrid /
    mode=vector, llmwiki-agent-bridge, or llmwiki-chat only when the
    lexical evidence is insufficient and the capability exists.

Minimal HTTP fields:

curl -s http://127.0.0.1:8765/query \
  -H 'content-type: application/json' \
  -d '{"query":"release readiness","limit":4}'

curl -s http://127.0.0.1:8765/search \
  -H 'content-type: application/json' \
  -d '{"query":"release readiness","mode":"lexical","query_variants":["required copy","release checklist"],"limit":5}'

Minimal MCP tool arguments:

{"name":"llmwiki_context","arguments":{"query":"release readiness","limit":4}}
{"name":"llmwiki_search","arguments":{"query":"release readiness","mode":"lexical","query_variants":["required copy","release checklist"],"limit":5}}

For this workflow, llmwiki-serve does not call an LLM, download a model,
build embeddings, synthesize final answers, or write source files. Authored
hot.md, index.md, and overview.md orientation is preferred when present.
Generic Markdown sources without authored orientation receive only a transient,
zero-write projection-extractive sketch in retrieval_guidance; it is not a
persisted index or generated wiki page.

Do not hard-code private hosts, ports, credentials, or bearer tokens in
committed agent instructions. Reusable Codex, Claude Code, and Copilot direct
client examples live in the llmwiki-agent-bridge repository under
integrations/; after public transfer, start with
https://github.com/knowledge-bridge-labs/llmwiki-agent-bridge/tree/main/integrations.
In local sibling checkouts, use ../llmwiki-agent-bridge/integrations/README.md.

Escalate to llmwiki-agent-bridge when the agent should call a single
model-backed answer endpoint instead of managing source retrieval itself.
Escalate to llmwiki-chat when a human needs to inspect graph context,
runtime selection, traces, and cited answers interactively.

Serving Surface

All entry points use the same read-only service behavior.

Surface Shape
CLI manifest, query, search, source-refs, source-bundle, serve, ls, and status.
HTTP GET /health, GET /manifest, GET /source-bundle, GET /source-refs, POST /query, POST /search, GET /read/{page_id}, GET /graph, GET /graph/neighborhood.
MCP-style JSON-RPC POST /mcp with tools/list and tools/call for llmwiki_context, llmwiki_search, llmwiki_read, llmwiki_graph, llmwiki_graph_neighbors, llmwiki_source_refs, and llmwiki_source_bundle.
MCP Streamable HTTP POST /mcp/stream using the official MCP Python SDK FastMCP Streamable HTTP transport for the same seven tools.
A2A-style compatibility Off by default. Enable GET /.well-known/agent-card.json and POST /message:send with llmwiki-serve serve --enable-a2a-compat or create_app(..., enable_a2a_compat=True).

GET /health is the lightweight readiness and discovery document for
connection setup. It identifies the service as llmwiki-serve, reports the
current source id, bundle id, projection counts, protocol endpoints,
capabilities, and CORS mode without exposing the local source root or literal
configured CORS origin values.

llmwiki-serve ls is the local operator discovery command for running servers.
It reads per-user registry records written by serve, probes local /health
for live records, and uses OS process/socket inspection to find actual local
command lines that invoke llmwiki-serve serve. For unregistered legacy/orphan
processes, it parses --host, --port, and the root argument when present,
then probes /health only through a local endpoint confirmed by the listener
socket table. It does not perform a default fixed-port or broad loopback scan,
and it does not request arbitrary argv hostnames or IP addresses. When launchers
or console-script wrappers expose more than one matching process for the same
endpoint, the reported PID is the TCP listener PID when the OS socket table can
verify it.
It reports PID when known, URL, source id, version, adapter, page counts,
health/stale status, registered/orphan status, discovery source, root source,
service verification, and duplicate or parent/subfolder hints. Exact process
candidates whose local listener cannot be verified, or whose listener-confirmed
/health probe times out or cannot connect, are reported as unhealthy with
service_verified=false; a 200 /health response from another service is
still excluded. Use llmwiki-serve ls --json for scripts,
llmwiki-serve ls --no-processes for registry-only output,
llmwiki-serve ls --probe-port <port> for an explicit manual loopback
diagnostic, llmwiki-serve ls --probe-timeout-seconds <seconds> to tune local
health probe tolerance, and llmwiki-serve ls --prune-stale to remove records
left by hard-killed processes. status is an alias for ls. Full root paths
may appear in local registry state and local --json output when they come from
registry records or process arguments; JSON marks this with root_source.
Default human output redacts roots to a short tail label, and raw command lines
are not rendered. HTTP manifest and health responses do not expose local roots.

Agents should call llmwiki_context first for a single grounded question.
Agents that coordinate host-owned RAG or multi-source orchestration should also
inspect llmwiki_source_bundle to discover the stable source identity,
projection signature, raw-origin metadata, and opaque source references.
Search, read, graph, and source-ref tools are follow-up tools for focused
inspection.

Search and query calls default to the full result shape and lexical ranking.
Callers can choose mode=literal for exact substring checks, or
operator-enabled preview mode=vector / mode=hybrid on servers that
advertise the matching capabilities. snippet_chars, result fields, and
exclude_page_ids apply across search modes. min_score is legacy
lexical/literal behavior and is rejected for vector or hybrid because vector
cosine and hybrid RRF scores are mode-specific, not calibrated probabilities.

MCP server metadata is scoped to the served wiki by default. The FastMCP server
name, FastMCP instructions, and MCP tool descriptions include the manifest
title, description, and source identity so clients can distinguish multiple
wiki servers. Operators can override this text with create_app(..., mcp_server_name=..., mcp_instructions=..., mcp_tool_description_prefix=...), llmwiki-serve serve --mcp-title,
--mcp-instructions, --mcp-tool-description-prefix, or the
LLMWIKI_MCP_SERVER_NAME / LLMWIKI_MCP_TITLE,
LLMWIKI_MCP_INSTRUCTIONS, and LLMWIKI_MCP_TOOL_DESCRIPTION_PREFIX
environment variables.

Full-graph output is intentionally conservative when callers omit limit.
/graph, MCP llmwiki_graph, and LlmWikiService.graph() default to 100
nodes; explicit graph requests can still ask for up to 2,000 nodes. Operators
can tune omitted-limit behavior with create_app(..., graph_default_limit=..., context_default_limit=...), llmwiki-serve serve --graph-default-limit,
--context-default-limit, or LLMWIKI_GRAPH_DEFAULT_LIMIT /
LLMWIKI_CONTEXT_DEFAULT_LIMIT. Use graph-neighborhood tools for focused graph
inspection before requesting a large full graph.

For CKG-like graph-guided retrieval, agents can call GET /graph/neighborhood
or MCP llmwiki_graph_neighbors after /query or llmwiki_context points to a
relevant page, source reference, tag, or sidecar graph node. Neighborhood lookup
returns a bounded subgraph around supplied seed values with optional direction,
depth, and relation filters. It is a compact inspection primitive, not a CKG
standard conformance claim and not a replacement for search or exact reads.

The generated FastAPI OpenAPI contract is committed at
docs/openapi.json. It covers the default HTTP and
MCP-style JSON-RPC compatibility surface; the mounted MCP Streamable HTTP ASGI
app is served at runtime, and A2A-style schemas are available only when the app
is created with A2A compatibility enabled.

What It Reads

  • Generic Markdown wikis with hot.md, index.md, overview.md, and topic
    pages.
  • Obsidian-style wikilinks such as [[Process Page]] and Markdown links to
    other .md pages.
  • YAML front matter fields such as id, title, status, review_state,
    source_refs, tags, and updated_at.
  • Folder-level graph structure from pages, headings, links, tags, and source
    references.
  • Optional sidecar graph facts from graph/graph.json.
  • Source-bundle metadata that identifies one served knowledge source, its
    current projection signature, visible source refs, and metadata-only raw-origin
    hints. Raw files remain owned by the operator or host RAG layer; llmwiki-serve
    does not read or expose arbitrary binary source content.

Named producer repositories in the architecture guide are compatible Markdown
output targets, not endorsed integrations or per-release support claims.
llmwiki-serve reads their generated or stored Markdown when it matches the
native folder contract or a supported adapter shape.

Do not confuse optional graph/graph.json graph facts with experimental
managed context. Native hot.md, index.md, overview.md, and root
quickstart.md files remain source-owned and untouched. Managed context is
generic-Markdown only, stores an external opaque sidecar outside the source
root, and is not a source page, not graph/graph.json, and not a replacement
for authored structure.

Compared With

Compared with Difference
Full-stack RAG app llmwiki-serve does not own ingestion jobs, embeddings, model calls, chat UX, auth, or hosting. It serves local files as context and protocol-shaped APIs.
Vector database No remote vector store is required. Default ranking is lexical over the current read-only Markdown projection; optional vector/hybrid modes use a local source-owned sidecar cache.
Wiki compiler or crawler It does not generate, crawl, normalize, migrate, or rewrite source Markdown.
MCP/A2A implementation It exposes an official-SDK MCP Streamable HTTP endpoint plus compatibility-test JSON-RPC and opt-in A2A-style surfaces, but does not claim A2A certification or exhaustive runtime feature completeness.
llmwiki-agent-bridge The bridge is the model/runtime escalation layer. llmwiki-serve remains the source projection layer underneath it.
llmwiki-chat Chat is the browser workbench. llmwiki-serve is the local API surface it can inspect or call.

Python API

The documented Python import surface is:

from llmwiki_serve import LlmWikiService, create_app

LlmWikiService owns manifest, source-bundle, source-ref, context, search,
read, graph, and refresh behavior. create_app builds the FastAPI app for
embedding the HTTP, MCP-style JSON-RPC, MCP Streamable HTTP, and optional
A2A-style compatibility surfaces. Other package modules are implementation
details unless documented here.

Safety Defaults

  • The selected source folder is immutable input. No source Markdown is
    rewritten, normalized, migrated, annotated, or uploaded by the server.
  • CLI manifest and query build a fresh projection for each process.
    Long-running serve instances cache an in-memory projection and refresh it on
    the next request when Markdown, Org, adapter marker/config, or
    graph/graph.json source files change. By default this freshness check runs
    before each request. Operators can opt into
    --refresh-interval-seconds <seconds> to reuse the current in-memory
    projection between checks for larger local graphs where a short visibility
    delay is acceptable.
  • Long-running serve instances can use --producer-manifest <path> as an
    explicit freshness contract for generated wiki outputs. When the configured
    non-symlink manifest file exists inside the served root, the server checks
    that marker instead of digesting every source file on each request. If source
    files change but the producer manifest does not, the cached projection may be
    reused. If the manifest is missing or unsafe, the server falls back to normal
    source scanning. The marker is not the public projection identity:
    projection.signature and bundle_id remain content-derived from
    projection-affecting source files and are recomputed on initial load and
    marker changes.
  • Production deployments that need projection reuse across worker processes can
    install llmwiki-serve[redis] and start serve with
    --projection-store redis --redis-url redis://.... Redis/Valkey stores
    derived projection artifacts only; Markdown folders and graph sidecars remain
    the source of truth. Use --source-id and --cache-namespace to keep shared
    Redis deployments collision-free. Treat Redis as sensitive storage: cached
    projections may include derived page text and front matter, including draft
    pages that are still filtered from network responses by the serving layer.
    GET /diagnostics/projection-store reports a stable backend_kind of
    memory or redis. Memory diagnostics return endpoint: null; Redis
    diagnostics return a sanitized endpoint label with userinfo, query
    parameters, and fragments removed.
  • Local or single-node deployments that need repeated graph traversal can start
    serve with --graph-store sqlite --graph-store-path <outside-root.sqlite>.
    SQLite GraphStore stores visibility-scoped derived graph snapshots only. It
    is not a source file, not a vector store, not a raw query database, and not a
    replacement for source freshness checks.
  • Draft and unpublished pages are withheld by default from read, search,
    context, and graph responses. Visibility blocks explicit non-serving markers:
    draft: true, published: false, publish: false,
    draft/proposed/needs_review review_state values, and status values such
    as draft, proposed, needs_review, blocked, unpublished, private,
    hidden, embargoed, confidential, internal, or withheld. Other
    lifecycle or maturity status values are served by default. HTTP and MCP
    tool include_drafts=true is honored only when --allow-drafts or
    create_app(..., allow_drafts=True) is used. A2A-style compatibility
    endpoints are disabled by default; when enabled, message:send always builds
    approved-only context.
  • Network manifest responses omit the local wiki root path. The CLI manifest is
    local operator output and includes the root path.
  • Long-running serve instances write a best-effort local instance registry
    record under per-user state so llmwiki-serve ls can list running servers.
    The registry contains PID, host, port, source identity, page counts, and the
    local root path; treat it as local diagnostic state. Set
    LLMWIKI_SERVE_STATE_DIR to choose a different state directory. ls also
    discovers unregistered legacy/orphan servers from OS process argv/cwd and
    socket ownership for command lines that match llmwiki-serve serve, parsing
    their host and port, and probing only those endpoints. Wrapper chains are
    deduped by endpoint and report the listener PID when the OS exposes it, with
    notes when the listener cannot be tied to a parsed serve process. New registry
    records also include process create time so PID reuse can be marked stale
    instead of treated as the original server. Pass --no-processes to disable
    process discovery, --probe-port <port> for an explicit manual loopback
    diagnostic, or --probe-timeout-seconds <seconds> to tune local health probe
    tolerance. Hard-killed processes can leave stale records, which ls reports
    and ls --prune-stale removes.
  • Long-running serve instances write local I/O debugging events by default to
    .runtime-logs/llmwiki-serve-io.jsonl. Events include method, path, status,
    duration, selected request bodies for /query, /mcp, /mcp/stream, and
    /message:send, and bounded response bodies. Authorization, cookies, tokens,
    credentials, API keys, common secret shapes, and the served local root are
    redacted. Use --io-log off or LLMWIKI_SERVE_IO_LOG=off to opt out.
  • The default HTTP CORS policy allows local browser origins on localhost,
    127.0.0.1, and IPv6 localhost [::1]; it is not a wildcard. Explicit
    --cors-origin values replace the default local allowlist.
  • Symlinked Markdown/Org source files, symlinked adapter marker/config files,
    and symlinked graph/graph.json sidecars are ignored by default so the served
    source tree stays within the selected wiki root.
  • Optional vector retrieval stores a sensitive derived sidecar outside the
    served source root. It stores checksum-named float32 .npy vectors, compact
    JSON page/chunk locator metadata, checksums, and provider identity, but not
    raw source text, snippets, raw queries, local roots, model local paths,
    secrets, or request-level provider controls.

Review SECURITY.md before exposing a wiki beyond a trusted local
environment. Use SUPPORT.md for issue routing and compatibility
report expectations.

Optional Semantic Retrieval Preview

Semantic retrieval is a preview and is off by default. Installing the vector
extra does not download a model, construct FastEmbed, build an index, or write
a vector cache until an operator explicitly enables a provider:

uv tool install "llmwiki-serve[vector]"
llmwiki-serve serve ./wiki \
  --vector-provider fastembed \
  --vector-model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2

For source-checkout development, use uv sync --extra dev --extra vector
instead of uv tool install.

Runtime model access defaults to local-files-only. To allow a first-use network
download, operators must opt in with --vector-model-download allow or
LLMWIKI_VECTOR_MODEL_DOWNLOAD=allow; public /query, /search, MCP, and A2A
request payloads cannot select provider, model, cache path, or download policy.
Use --vector-cache-dir / LLMWIKI_VECTOR_CACHE_DIR to choose an external
sidecar directory; use --vector-model-cache-dir /
LLMWIKI_VECTOR_MODEL_CACHE_DIR to choose an external FastEmbed model cache.
Both paths are resolved before provider startup, and paths equal to or under
the served root are rejected.

The first provider is FastEmbed with the explicit candidate model
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2, resolved through
FastEmbed 0.8.0 to Hugging Face source
qdrant/paraphrase-multilingual-MiniLM-L12-v2-onnx-Q revision
faf4aa4225822f3bc6376869cb1164e8e3feedd0, dimension 384, license
apache-2.0. The model name is multilingual, but this repository does not
claim Korean semantic quality until a separate Korean benchmark is accepted.

Lexical remains the default. Health, manifest, source-bundle, and MCP metadata
advertise llmwiki_search_mode_vector and llmwiki_search_mode_hybrid only
when the configured provider is usable. Disabled or unavailable vector/hybrid
requests fail actionably instead of silently falling back to lexical. Scores are
mode-specific: lexical/literal keep existing meanings, vector is exact cosine
for the best page chunk, and hybrid is a fixed weighted RRF score.

Hybrid is lexical plus dense retrieval with weighted RRF and bounded optional
read-only orientation hints. Canonical root hot.md, index.md, and
overview.md pages can guide a capped related set through visible links,
source refs, and tags, but retrieval never generates, replaces, or modifies
those files. If there is no safe related set, hybrid falls back exactly to plain
lexical+dense RRF. This is not GraphRAG, not universal orientation-first
retrieval, and not a guarantee that hybrid improves every wiki or query.

The exact local backend has been validated only around the current recorded
small/team corpus and chunk counts on Windows local and DGX Spark Ubuntu dirty
snapshot engineering runs. Larger corpus claims are experimental until the
10k/50k/100k/500k gates are accepted and rerun from clean commits. Current
dirty-snapshot vector/hybrid reports are engineering evidence only; public
performance claims require clean commit reports tied to the release revision.

The preview does not provide calibrated abstention, reliable no-evidence
thresholds, poisoning safety, broad multilingual quality, SOTA quality claims,
or vector-database-scale guarantees. Korean diagnostics and synthetic
orientation fixtures are useful engineering signals, not headline language or
security claims.

Concurrent first-use index builds are coordinated by a sidecar-local lock. If
another process owns the cold-build lock longer than the timeout, the request
fails retryably instead of reading a partial cache. Retry the semantic request
after the active builder finishes.

Future experiments may evaluate newer embedding models, rerankers, ANN indexes,
Redis vector search, hosted vector databases, and remote embedding providers.
They are not bundled defaults in this preview. For the full boundary, scoring
constants, fallback rules, and benchmark posture, see the
semantic vector retrieval spec and
vector retrieval ADR.

Optional SQLite GraphStore

SQLite GraphStore is an opt-in derived graph snapshot cache for local and
single-node deployments. It uses Python's standard sqlite3 module, so no
extra package is required:

llmwiki-serve serve ./wiki \
  --graph-store sqlite \
  --graph-store-path ../.llmwiki-cache/wiki-graph.sqlite

Environment equivalents are available for process managers:

LLMWIKI_GRAPH_STORE=sqlite
LLMWIKI_GRAPH_STORE_PATH=../.llmwiki-cache/wiki-graph.sqlite

LLMWIKI_GRAPH_STORE defaults to none. Passing --graph-store none
explicitly disables the GraphStore and ignores LLMWIKI_GRAPH_STORE_PATH;
SQLite is used only with --graph-store sqlite or LLMWIKI_GRAPH_STORE=sqlite
and requires a graph-store path outside the served root.

Use it when the same long-running server repeatedly serves graph-heavy
requests or when agent workflows call /graph, /graph/neighborhood,
llmwiki_graph, or llmwiki_graph_neighbors many times over the same
projection. The cache key includes schema version, --cache-namespace,
source id, bundle id, projection signature, and draft visibility scope. Source
changes produce a new projection signature and therefore a new graph snapshot.

The SQLite file is sensitive derived local state. It stores graph node labels,
paths, relations, source-ref and tag nodes, and metadata after visibility
filtering. Keep it outside the served root, protect it like the source wiki,
and do not publish the file, raw rows, or private graph snippets. If the file
is missing, invalid, or stale, the server treats it as a cache miss and
recomputes the graph from the current projection.

Startup configuration remains strict: sqlite requires a path and the path
must be outside the served root and openable as SQLite. After startup,
--graph-store-failure-policy fallback-local is the default runtime policy and
keeps serving by recomputing from the current projection on backend errors;
fail-fast raises a redacted runtime error instead.

SQLite GraphStore is not a graph query language backend. The public graph
surface remains the existing bounded graph APIs. The internal typed graph
provider is structured and raw-query-free; future production graph backends
should preserve that safe contract.

Optional Redis/Valkey Projection Cache

Most users should start without Redis:

uv tool install llmwiki-serve
llmwiki-serve serve ./wiki --host 127.0.0.1 --port 8765

Use Redis or Valkey only when a long-running deployment needs to reuse the same
derived projection across worker processes, cold restarts, or repeated service
instances. Redis does not make source queries semantically smarter, does not
replace file freshness checks, is not the source of truth, and does not store
conversation history, orchestration state, or model prompt caches.

Install the optional extra and pass an explicit namespace and source id for
shared deployments:

uv tool install "llmwiki-serve[redis]"
llmwiki-serve serve ./wiki \
  --projection-store redis \
  --redis-url redis://127.0.0.1:6379/0 \
  --cache-namespace acme-prod \
  --source-id project-alpha \
  --redis-failure-policy fail-fast

Environment variables are available for process managers and containers:

LLMWIKI_PROJECTION_STORE=redis
LLMWIKI_REDIS_URL=redis://127.0.0.1:6379/0
LLMWIKI_CACHE_NAMESPACE=acme-prod
LLMWIKI_SOURCE_ID=project-alpha

Failure policy is CLI-only, so add it to the server start command when using
environment-based Redis configuration:

llmwiki-serve serve ./wiki --redis-failure-policy fail-fast

--redis-failure-policy fallback-local is the default and keeps serving from
process memory after a Redis client failure. Use fail-fast when production
operators require shared-cache availability and want misconfiguration or Redis
outages to stop the server.

For local Docker validation, use a non-sensitive fixture and an isolated
namespace:

docker run -d --rm --name llmwiki-projection-cache \
  -p 127.0.0.1:6379:6379 \
  valkey/valkey:8
LLMWIKI_REDIS_URL=redis://127.0.0.1:6379/0 \
  uv run pytest -q tests/test_redis_projection_store_integration.py
docker stop llmwiki-projection-cache

For managed Redis or Valkey, use network isolation, authentication, TLS where
available, deployment secrets for URLs, and deployment-specific namespaces. Do
not point a public or shared untrusted Redis instance at private wiki content.

Redis payloads are sensitive derived storage. Cached projections can include
page text, front matter, source refs, graph metadata, and draft pages that
normal network responses still withhold. The current implementation keys
records by projection signature and does not apply an automatic TTL. If content
is deleted, renamed, or reclassified from draft/private to another state,
operators should use Redis eviction/TTL policy, rotate --cache-namespace, or
perform namespace cleanup during maintenance. Do not paste raw Redis URLs,
credentials, raw keys, cached values, or private snippets into release notes,
issues, or diagnostics screenshots.

llmwiki-agent-bridge, llmwiki-chat, Hermes, DeepAgents, and host agents own
runtime prompt, history, and prefix-cache behavior. Keep those caches in the
runtime, bridge, or workbench layer; llmwiki-serve[redis] only caches the
read-only source projection.

For UI status cards, GET /diagnostics/projection-store keeps the existing
diagnostic fields and adds backend_kind plus endpoint. backend_kind is
memory or redis; endpoint is null for memory and a sanitized Redis label
such as redis://127.0.0.1:6379/0 for Redis. The label never includes Redis
userinfo, passwords, query parameters, fragments, local file paths, keys, or
payloads.

Repository Structure

Path Purpose
src/llmwiki_serve/ Service, parser, projection, API, and CLI implementation.
examples/ Public sample wiki and example usage notes.
docs/ Architecture, OpenAPI contract, and release guidance for source-checkout users.
scripts/ Release smoke and candidate-sample helper scripts.
tests/ Unit tests, adapter fixtures, and compatibility smoke coverage.
pyproject.toml, uv.lock Python package metadata and locked development environment.

Project Posture

llmwiki-serve is independent community tooling for LLM Wiki-style Markdown
knowledge folders. It is Apache-2.0 licensed and is not an official project from
Andrej Karpathy or any upstream producer named in compatibility examples.

This repository is in public preview. PyPI install availability and the current
package baseline are tracked in the hosted
Release Status & Compatibility
matrix, and source checkout remains supported for local development and release
smoke tests.

The current protocol surface is HTTP plus MCP-style JSON-RPC, MCP Streamable
HTTP, and opt-in A2A-style message shapes. The Streamable HTTP endpoint uses the
official MCP Python SDK FastMCP transport; the compatibility endpoints are local
agent and harness surfaces, not a claim of A2A certification, exhaustive runtime
feature completeness, or upstream producer certification.

Validation

For a quick source-checkout smoke:

uv run python scripts/check_third_party_notices.py
uv run python scripts/export_openapi.py --check
uv run python scripts/release_smoke.py

For a release-oriented local gate:

uv run ruff format --check .
uv run ruff check .
uv run mypy src
uv run pytest -q
uv build
uv run python scripts/release_smoke.py --dist-dir dist

The release smoke checks the bundled sample wiki through CLI, HTTP,
MCP-style JSON-RPC, MCP Streamable HTTP, and opt-in A2A-style message shapes,
including draft filtering, local-only CORS, MCP error redaction, source
immutability, source distribution contents, OpenAPI contract freshness, and
packaged wheel CLI installation.

Optional validation paths are documented in docs/release.md:
real local-server curl checks, pinned public upstream sample snapshot smoke, and
generated candidate sample artifacts. Current public release status is
summarized on the
Release Status
page, and repository benchmark evidence lives under
benchmarks/verified_sources/reports/.
These are compatibility-smoke records for the current serving contract,
not quality certification or upstream producer certification. They do not
certify retrieval quality, answer quality, upstream producer versions, full
MCP/A2A protocol support, private wiki safety, live network deployment,
authentication, TLS, or every application-specific
Obsidian/Logseq/Foam/Dendron/Quartz feature.

Benchmark Evidence

For 0.2.8, the repo also includes a reproducible retrieval benchmark on the
official BEIR SciFact test split projected to Markdown and queried through
LlmWikiService.search(query, limit=100). Both final reports use package
0.2.8, immutable revision
git:8d04e8a46487827ee488a7ddab005aaab8dd885d, the opt-in english
analyzer, 5,183 corpus docs, 300 test queries, and 339 qrels. The product
default analyzer remains legacy.

Environment nDCG@10 Recall@100 Report
Windows local 0.6905159872 0.9286666667 beir-scifact-windows-2026-08-01.json
DGX Spark Ubuntu 0.6905159872 0.9286666667 beir-scifact-dgx-spark-ubuntu-2026-08-01.json

The reports include product-secondary Recall@5, Hit@5, MRR@10, latency, payload
bytes, source checksums, license attribution, metric definitions, and fixed
external reference rows. The external rows cite BEIR paper BM25
(0.665 nDCG@10 / 0.908 Recall@100) and Anserini/Pyserini flat BM25
(0.6789 nDCG@10 / 0.9253 Recall@100); those rows are contextual published
references and were not run by llmwiki-serve.

Benchmark adapters are repository-level reproducibility tooling under
scripts/benchmark_adapters/, not installed llmwiki-serve console commands.
See
benchmarks/verified_sources/reports/README.md
for provenance, validation, rerun notes, and limitations.

The repo also includes a separate curated orientation mechanism benchmark under
benchmarks/orientation_mechanism/. It
uses synthetic public-safe Markdown to verify hot/index-first hybrid behavior,
exact no-orientation fallback, exact identifiers, boilerplate resistance, and
approved-only draft isolation. It is curated mechanism evidence only, not an
external retrieval-quality or language-quality benchmark.

The sdist also ships the tiny agent-guided lexical harness under
benchmarks/agent_guided_lexical/ with its
fixture, schema, gates, and runner dependencies. It does not ship generated
report JSON; local report outputs belong in runtime paths such as
.runtime-logs/ and are not package artifacts.

Project Documents

License

Apache-2.0. See LICENSE.

Yorumlar (0)

Sonuc bulunamadi