Files
qmd-memory-gateway/scripts/qmd-entrypoint.sh

66 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
CACHE_HOME="${XDG_CACHE_HOME:-/var/lib/qmd/cache}"
CONFIG_HOME="${XDG_CONFIG_HOME:-/var/lib/qmd/config}"
PORT="${QMD_HTTP_PORT:-8181}"
INTERNAL_PORT="${QMD_INTERNAL_PORT:-8182}"
QMD_LLM_FILE="${QMD_LLM_FILE:-/usr/local/lib/node_modules/@tobilu/qmd/dist/llm.js}"
mkdir -p "${CACHE_HOME}/qmd" "${CONFIG_HOME}/qmd"
apply_model_overrides() {
if [[ -z "${QMD_EMBED_MODEL_URI:-}" && -z "${QMD_RERANK_MODEL_URI:-}" && -z "${QMD_GENERATE_MODEL_URI:-}" ]]; then
return 0
fi
if [[ ! -f "${QMD_LLM_FILE}" ]]; then
echo "WARN: llm.js not found at ${QMD_LLM_FILE}, skip model overrides." >&2
return 0
fi
QMD_LLM_FILE="${QMD_LLM_FILE}" node - <<'NODE'
const fs = require("fs");
const llmFile = process.env.QMD_LLM_FILE;
let src = fs.readFileSync(llmFile, "utf8");
const replacements = [
["DEFAULT_EMBED_MODEL", process.env.QMD_EMBED_MODEL_URI],
["DEFAULT_RERANK_MODEL", process.env.QMD_RERANK_MODEL_URI],
["DEFAULT_GENERATE_MODEL", process.env.QMD_GENERATE_MODEL_URI],
];
for (const [name, value] of replacements) {
if (!value) continue;
const pattern = new RegExp(`const ${name} = \\"[^\\"]+\\";`);
if (!pattern.test(src)) {
console.error(`WARN: failed to find ${name} in ${llmFile}`);
continue;
}
src = src.replace(pattern, `const ${name} = ${JSON.stringify(value)};`);
}
fs.writeFileSync(llmFile, src, "utf8");
NODE
}
apply_model_overrides
qmd mcp --http --port "${INTERNAL_PORT}" &
qmd_pid=$!
socat "TCP-LISTEN:${PORT},fork,reuseaddr,bind=0.0.0.0" "TCP6:[::1]:${INTERNAL_PORT}" &
proxy_pid=$!
cleanup() {
kill "${proxy_pid}" "${qmd_pid}" 2>/dev/null || true
wait "${proxy_pid}" "${qmd_pid}" 2>/dev/null || true
}
trap cleanup SIGINT SIGTERM
wait -n "${qmd_pid}" "${proxy_pid}"
status=$?
cleanup
exit "${status}"