Files
2026-05-04 09:50:03 -04:00

72 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
usage() {
cat >&2 <<'EOF'
Usage:
semantic_index/search.sh "query text" [project_identifier] [limit]
Examples:
semantic_index/search.sh "goods return" customer-service 3
semantic_index/search.sh "candidate follow up" hiring 5 | jq '.results[] | {id, score, citation}'
Environment:
SEMANTIC_INDEX_URL default: http://127.0.0.1:8787
SEMANTIC_INDEX_API_KEY optional; falls back to semantic_index/.env or .env
EOF
}
if [[ $# -lt 1 ]]; then
usage
exit 2
fi
query=$1
project=${2:-}
limit=${3:-10}
base_url=${SEMANTIC_INDEX_URL:-http://127.0.0.1:8787}
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
install_root=$(cd "$script_dir/.." && pwd)
read_env_value() {
local key=$1
local file
for file in /etc/semantic-index.env "$install_root/semantic_index/.env" "$install_root/.env" semantic_index/.env .env; do
if [[ -f "$file" ]]; then
awk -F= -v key="$key" '
$1 == key {
value = substr($0, index($0, "=") + 1)
gsub(/^[ \t"'\''"]+|[ \t"'\''"]+$/, "", value)
print value
exit
}
' "$file"
return
fi
done
}
json_escape() {
sed \
-e 's/\\/\\\\/g' \
-e 's/"/\\"/g' \
-e ':a;N;$!ba;s/\n/\\n/g'
}
escaped_query=$(printf '%s' "$query" | json_escape)
payload="{\"query\":\"$escaped_query\",\"limit\":$limit"
if [[ -n "$project" ]]; then
escaped_project=$(printf '%s' "$project" | json_escape)
payload="$payload,\"project_identifier\":\"$escaped_project\""
fi
payload="$payload}"
api_key=${SEMANTIC_INDEX_API_KEY:-$(read_env_value SEMANTIC_INDEX_API_KEY)}
args=(-sS -H "Content-Type: application/json" -d "$payload")
if [[ -n "${api_key:-}" ]]; then
args+=(-H "Authorization: Bearer $api_key")
fi
curl "${args[@]}" "$base_url/search"