Resolves the 4 P4 blockers and wires cognee/cognee-mcp into the openai compose stack: - qdrant: container was gone (data intact under /mnt/ssd/dbs/qdrant); brought back up, confirmed healthy on :6333. - Embeddings: switched from a dead LiteLLM route to ollama directly (host.docker.internal:11436, nomic-embed-text, 768-dim), using cognee's dedicated OllamaEmbeddingEngine and its native /api/embed endpoint. Requires extra_hosts: host.docker.internal:host-gateway since ollama lives in a separate compose project. - cognee-llm kimi auth: root cause was that cognee-llm had never been started, so its kimi-agent-home-equivalent volume didn't exist yet. Seeded cognee-llm-home from the already-authed kimi-agent-home volume (read-only copy of config/credentials/oauth/device_id); cognee-llm now serves real completions. - mkdir'd cognee data/system dirs: confirmed present (done by user). Also fixed three issues found only during a live end-to-end smoke test: - VECTOR_DB_PROVIDER must be a real container env var, not just present in the mounted cognee.env — the qdrant adapter's sitecustomize.py registration hook reads os.environ directly, which pydantic-settings' env_file parsing never populates. - Baked the Kuzu/Ladybug JSON extension into the cognee image. This deployment's egress to extension.ladybugdb.com is bandwidth-throttled to ~1.2 KB/s, so cognee's own runtime auto-download reliably timed out, leaving /health permanently unhealthy and graph queries failing. Fetched the ~827KB extension out-of-band (16-way parallel ranged GETs) and added it to the image via COPY. - LLM_ENDPOINT needed an explicit /v1 suffix (litellm appends "/chat/completions" verbatim) and LLM_INSTRUCTOR_MODE=json_mode is required since cognee-llm's Kimi wrapper is a text-only pass-through with no real tool-calling support. Verified with a full remember -> recall round trip through cognee-mcp's MCP tool surface: stored a fact containing a codeword, recalled it via GRAPH_COMPLETION search, got the exact codeword back. Exercises cognee-llm, ollama embeddings, Qdrant, and Kuzu together. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
67 lines
4.0 KiB
Docker
67 lines
4.0 KiB
Docker
# Adolf P4 — cognee memory service.
|
|
#
|
|
# Base: official upstream image (do not hand-roll cognee itself). Adds ONE
|
|
# thing upstream doesn't ship: Qdrant vector-store support. Qdrant is a
|
|
# *community* adapter (separate PyPI package, not one of cognee's own
|
|
# `[project.optional-dependencies]` extras — the image's own EXTRAS=
|
|
# mechanism only installs cognee's own extras, so it can't pull this in).
|
|
#
|
|
# Version note: cognee-community-vector-adapter-qdrant's declared dependency
|
|
# pin (both the PyPI release 0.2.4 -> cognee==0.5.6, and the unreleased
|
|
# GitHub main 0.3.0 -> cognee==1.1.0) trails this image's cognee 1.2.2.
|
|
# Installed with --no-deps (below) to avoid pip fighting that pin and
|
|
# downgrading cognee. Verified compatible by direct import test on 2026-07-05:
|
|
# both registry hooks the adapter calls (`use_vector_adapter`,
|
|
# `use_dataset_database_handler` from cognee.infrastructure.databases.*)
|
|
# exist unchanged in cognee 1.2.2, and a full container import of
|
|
# cognee_community_vector_adapter_qdrant.register succeeds with no error
|
|
# against this exact image. Not yet exercised against a live Qdrant round
|
|
# trip (cognify + search) — do that once the LiteLLM LLM/embedder blockers
|
|
# below are resolved, as a final confirmation.
|
|
FROM cognee/cognee:1.2.2
|
|
|
|
# qdrant-client is the adapter's one genuinely-missing runtime dependency
|
|
# (starlette/instructor are already satisfied by cognee's own base deps).
|
|
# Installed normally (with deps) since it's a fresh package, not a conflict.
|
|
RUN /usr/local/bin/pip --python /app/.venv/bin/python install --no-cache-dir \
|
|
"qdrant-client>=1.18.0"
|
|
|
|
# Pinned to a specific commit for reproducibility (no tagged release exists
|
|
# yet compatible with our cognee version — see version note above).
|
|
RUN /usr/local/bin/pip --python /app/.venv/bin/python install --no-cache-dir --no-deps \
|
|
"https://github.com/topoteretes/cognee-community/archive/52281288052970f57e533b9be75b64da9ac7c773.tar.gz#subdirectory=packages/vector/qdrant"
|
|
|
|
# sitecustomize.py auto-imports at every Python interpreter start in this
|
|
# venv. Gated on VECTOR_DB_PROVIDER so it's a no-op unless qdrant is actually
|
|
# selected — this is the adapter's own documented registration call
|
|
# (cognee-community-vector-adapter-qdrant README: "Import and register the
|
|
# adapter in your code: from cognee_community_vector_adapter_qdrant import
|
|
# register"), just run automatically instead of requiring a cognee source
|
|
# edit to add the import.
|
|
RUN printf '%s\n' \
|
|
'import os' \
|
|
'if os.environ.get("VECTOR_DB_PROVIDER") == "qdrant":' \
|
|
' from cognee_community_vector_adapter_qdrant import register # noqa: F401' \
|
|
> /app/.venv/lib/python3.12/site-packages/sitecustomize.py
|
|
|
|
# Pre-installed Kuzu/Ladybug JSON extension (P4 deploy blocker fix, 2026-07-05).
|
|
# cognee's graph adapter (cognee/infrastructure/databases/graph/ladybug/adapter.py)
|
|
# always tries `LOAD EXTENSION JSON` on startup and on every /health graph check,
|
|
# falling back to `INSTALL JSON` (a network download from
|
|
# extension.ladybugdb.com) if not already cached at
|
|
# ~/.lbdb/extension/<kuzu_version>/<platform>/json/libjson.lbug_extension. This
|
|
# extension is required for recall/temporal-search graph queries — without it
|
|
# cognee's /health reports "unhealthy" and graph queries that use JSON fail
|
|
# with a Binder exception ("Extension: json ... has not been installed").
|
|
#
|
|
# This deployment's egress to extension.ladybugdb.com is severely
|
|
# bandwidth-throttled (~1-1.2 KB/s per connection — confirmed via direct curl,
|
|
# not a proxy/DNS block: TLS handshake and HTTP 200 succeed, the transfer
|
|
# itself just crawls), so the runtime auto-download reliably times out before
|
|
# the ~827KB file finishes, and every subsequent health check/query re-attempts
|
|
# and fails the same way. Downloaded once out-of-band (16-way parallel ranged
|
|
# GETs, ~846920 bytes, verified ELF shared object) and baked into the image
|
|
# here so the container never needs to touch that host at runtime.
|
|
COPY extensions/0.17.0/linux_amd64/json/libjson.lbug_extension \
|
|
/root/.lbdb/extension/0.17.0/linux_amd64/json/libjson.lbug_extension
|