Per docs/research/langchain-pgvector-vs-litellm-pgvector.md (issue #25): the vendored litellm-pgvector connector (793 lines, Prisma migrations, a fragile git-context build) is replaced by a ~90-line FastAPI service (services/memory-retrieval/) wrapping langchain_postgres.PGVector directly against pgvector-db. Same gateway boundary — it still calls litellm for embeddings, nothing talks to Postgres or the model directly except this service. - New services/memory-retrieval/ (main.py, Dockerfile, requirements.txt): POST /ingest, POST /query, GET /health. - docker-compose.yml: litellm-pgvector service replaced by memory-retrieval; pgvector-db and embedding-server untouched. - litellm-config.yaml: vector_store_registry block removed (no langchain_postgres provider exists to register against; callers query memory-retrieval directly instead of an in-band file_search tool call — that mechanism was never confirmed working per issue #24 anyway). - scripts/ingest-memory.sh rewritten for the new /ingest endpoint (same per-line chunking, no dedup). - .env vars renamed: LITELLM_PGVECTOR_API_KEY/LITELLM_PGVECTOR_EMBEDDING_KEY -> MEMORY_RETRIEVAL_API_KEY/MEMORY_RETRIEVAL_EMBEDDING_KEY. - vendor/litellm-pgvector/ removed entirely. - docs/memory-knowledgebase.md updated for the new setup/query flow. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
40 lines
1.4 KiB
Bash
40 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
# Loads data/memory.md and data/claude-legacy-memory.md into the
|
|
# memory-retrieval knowledgebase (POST /ingest).
|
|
#
|
|
# ponytail: one chunk per non-empty, non-heading line — both source files are
|
|
# already one fact/paragraph per line (no hard-wrapping), so this needs no
|
|
# real chunking logic. Re-run after editing either file; there's no dedup,
|
|
# PGVector always inserts — clear the collection first if you need a clean
|
|
# reload.
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
|
|
[ -f .env ] && set -a && . ./.env && set +a
|
|
|
|
: "${MEMORY_RETRIEVAL_API_KEY:?Set MEMORY_RETRIEVAL_API_KEY in .env first}"
|
|
MEMORY_RETRIEVAL_URL="${MEMORY_RETRIEVAL_URL:-http://localhost:8000}"
|
|
|
|
ingest_file() {
|
|
local file="$1" section=""
|
|
local chunks="[]"
|
|
while IFS= read -r line; do
|
|
case "$line" in
|
|
"#"*) section="${line#\# }"; section="${section#\#\# }"; continue ;;
|
|
""|"---") continue ;;
|
|
esac
|
|
chunks=$(jq --arg content "$line" --arg source "$file" --arg section "$section" \
|
|
'. += [{"content": $content, "metadata": {"source": $source, "section": $section}}]' <<<"$chunks")
|
|
done < "$file"
|
|
|
|
echo "Ingesting $(jq 'length' <<<"$chunks") chunks from $file..."
|
|
curl -sf -X POST "${MEMORY_RETRIEVAL_URL}/ingest" \
|
|
-H "Authorization: Bearer ${MEMORY_RETRIEVAL_API_KEY}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"chunks\": ${chunks}}" > /dev/null
|
|
}
|
|
|
|
ingest_file data/memory.md
|
|
ingest_file data/claude-legacy-memory.md
|
|
echo "Done."
|