You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
5.0 KiB
141 lines
5.0 KiB
#!/bin/bash |
|
# Tes API project-search (Ollama + indeks NAS) dari reverse proxy 10.100.1.24 |
|
# |
|
# Usage (di server .24): |
|
# |
|
# OAuth2 Client Credentials (disarankan): |
|
# export PROJECT_SEARCH_OAUTH_CLIENT_ID='a2072649-3215-4701-af9f-d89d13875105' |
|
# export PROJECT_SEARCH_OAUTH_CLIENT_SECRET='...' |
|
# ./scripts/test-project-search.sh |
|
# |
|
# LDAP JWT: |
|
# export PROJECT_SEARCH_API_USER='admin' |
|
# export PROJECT_SEARCH_API_PASS='password-ldap' |
|
# ./scripts/test-project-search.sh "carikan projek Pertamina" |
|
# |
|
# API token statis: |
|
# export PROJECT_SEARCH_API_TOKEN='dbl_...' |
|
# ./scripts/test-project-search.sh |
|
# |
|
# Dari laptop (upload + jalankan): |
|
# scp -o MACs=hmac-sha1 scripts/test-project-search.sh root@10.100.1.24:/tmp/ |
|
# ssh -m hmac-sha1 root@10.100.1.24 -p 22 "chmod +x /tmp/test-project-search.sh && \ |
|
# PROJECT_SEARCH_OAUTH_CLIENT_ID=... PROJECT_SEARCH_OAUTH_CLIENT_SECRET=... /tmp/test-project-search.sh" |
|
|
|
set -euo pipefail |
|
|
|
API_BASE="${PROJECT_SEARCH_API_BASE:-http://127.0.0.1:8091}" |
|
QUERY="${1:-carikan projek Pertamina}" |
|
LIMIT="${PROJECT_SEARCH_LIMIT:-10}" |
|
SOURCES_JSON="${PROJECT_SEARCH_SOURCES:-[\"project\"]}" |
|
OAUTH_CLIENT_ID="${PROJECT_SEARCH_OAUTH_CLIENT_ID:-a2072649-3215-4701-af9f-d89d13875105}" |
|
OAUTH_SCOPE="${PROJECT_SEARCH_OAUTH_SCOPE:-project-search:read}" |
|
|
|
if ! command -v curl >/dev/null 2>&1; then |
|
echo "curl tidak ditemukan." >&2 |
|
exit 1 |
|
fi |
|
|
|
json_pretty() { |
|
if command -v python3 >/dev/null 2>&1; then |
|
python3 -m json.tool |
|
elif command -v jq >/dev/null 2>&1; then |
|
jq . |
|
else |
|
cat |
|
fi |
|
} |
|
|
|
json_get() { |
|
local expr="$1" |
|
python3 -c "import sys,json; d=json.load(sys.stdin); print($expr)" |
|
} |
|
|
|
echo "==> API base: ${API_BASE}" |
|
echo "==> Query : ${QUERY}" |
|
echo |
|
|
|
if [[ -n "${PROJECT_SEARCH_API_TOKEN:-}" ]]; then |
|
TOKEN="$PROJECT_SEARCH_API_TOKEN" |
|
echo "==> Auth: API token (prefix ${TOKEN:0:8}...)" |
|
elif [[ -n "${PROJECT_SEARCH_OAUTH_CLIENT_SECRET:-}" ]]; then |
|
if ! command -v python3 >/dev/null 2>&1; then |
|
echo "python3 diperlukan untuk parse OAuth token JSON." >&2 |
|
exit 1 |
|
fi |
|
echo "==> Auth: OAuth2 Client Credentials" |
|
echo " client_id: ${OAUTH_CLIENT_ID}" |
|
echo " scope : ${OAUTH_SCOPE}" |
|
TOKEN_JSON=$(curl -sf -X POST "${API_BASE}/oauth/token" \ |
|
-H 'Content-Type: application/x-www-form-urlencoded' \ |
|
-d "grant_type=client_credentials" \ |
|
-d "client_id=${OAUTH_CLIENT_ID}" \ |
|
-d "client_secret=${PROJECT_SEARCH_OAUTH_CLIENT_SECRET}" \ |
|
-d "scope=${OAUTH_SCOPE}") \ |
|
|| { echo "OAuth token request gagal (cek client_id/secret/scope)." >&2; exit 1; } |
|
TOKEN=$(printf '%s' "$TOKEN_JSON" | json_get "d['access_token']") |
|
if [[ -z "$TOKEN" ]]; then |
|
echo "access_token kosong. Respons:" >&2 |
|
printf '%s\n' "$TOKEN_JSON" | json_pretty >&2 |
|
exit 1 |
|
fi |
|
echo " Token OK (${#TOKEN} chars)" |
|
elif [[ -n "${PROJECT_SEARCH_API_USER:-}" && -n "${PROJECT_SEARCH_API_PASS:-}" ]]; then |
|
if ! command -v python3 >/dev/null 2>&1; then |
|
echo "python3 diperlukan untuk parse login JSON." >&2 |
|
exit 1 |
|
fi |
|
echo "==> Auth: LDAP JWT — ${PROJECT_SEARCH_API_USER}" |
|
LOGIN_JSON=$(curl -sf -X POST "${API_BASE}/api/v1/auth/login" \ |
|
-H 'Content-Type: application/json' \ |
|
-d "{\"username\":\"${PROJECT_SEARCH_API_USER}\",\"password\":\"${PROJECT_SEARCH_API_PASS}\"}") \ |
|
|| { echo "Login API gagal (cek kredensial / LDAP)." >&2; exit 1; } |
|
TOKEN=$(printf '%s' "$LOGIN_JSON" | json_get "d['data']['access_token']") |
|
if [[ -z "$TOKEN" ]]; then |
|
echo "Token kosong. Respons login:" >&2 |
|
printf '%s\n' "$LOGIN_JSON" | json_pretty >&2 |
|
exit 1 |
|
fi |
|
echo " Token OK (${#TOKEN} chars)" |
|
else |
|
echo "Set salah satu metode auth:" >&2 |
|
echo " PROJECT_SEARCH_OAUTH_CLIENT_SECRET (+ optional PROJECT_SEARCH_OAUTH_CLIENT_ID)" >&2 |
|
echo " PROJECT_SEARCH_API_USER + PROJECT_SEARCH_API_PASS" >&2 |
|
echo " PROJECT_SEARCH_API_TOKEN" >&2 |
|
exit 1 |
|
fi |
|
|
|
AUTH_HEADER="Authorization: Bearer ${TOKEN}" |
|
|
|
echo |
|
echo "==> GET /api/v1/project-search/sources" |
|
curl -sf "${API_BASE}/api/v1/project-search/sources" -H "$AUTH_HEADER" | json_pretty |
|
|
|
echo |
|
echo "==> GET /api/v1/project-search/index/status" |
|
curl -sf "${API_BASE}/api/v1/project-search/index/status" -H "$AUTH_HEADER" | json_pretty |
|
|
|
echo |
|
echo "==> POST /api/v1/project-search/ask" |
|
ASK_BODY=$(cat <<EOF |
|
{"query":"${QUERY}","sources":${SOURCES_JSON},"limit":${LIMIT}} |
|
EOF |
|
) |
|
ASK_RESP=$(curl -sf -X POST "${API_BASE}/api/v1/project-search/ask" \ |
|
-H "$AUTH_HEADER" \ |
|
-H 'Content-Type: application/json' \ |
|
-d "$ASK_BODY") || { echo "Request ask gagal." >&2; exit 1; } |
|
|
|
printf '%s\n' "$ASK_RESP" | json_pretty |
|
|
|
echo |
|
if command -v python3 >/dev/null 2>&1; then |
|
COUNT=$(printf '%s' "$ASK_RESP" | json_get "len(d.get('data',{}).get('results',[]))") |
|
ANSWER=$(printf '%s' "$ASK_RESP" | json_get "d.get('data',{}).get('answer','')[:300]") |
|
echo "==> Ringkasan: ${COUNT} hasil" |
|
echo "==> Jawaban (300 char pertama):" |
|
echo "$ANSWER" |
|
fi |
|
|
|
echo |
|
echo "OK — project-search API merespons."
|
|
|