Files
AgapHost/openai/cognee/Dockerfile
alvis 1e66d3dcb5 openai: deploy cognee + cognee-mcp memory service [Adolf P4]
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
2026-07-05 15:35:05 +00:00

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