update ai insight migration for all page
This commit is contained in:
1 parent
07d36081ce
commit
18790ab8f6
69 files changed
+9457
-399
No files matched your search
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
# Smoke-test AI Insight generate (qwen2.5:3b). Prefer NUC/server, not laptop as proof.
|
||||
# Prerequisites: API + RAG + llm containers up, model pulled, DB migrated.
|
||||
#
|
||||
# export API_BASE=http://127.0.0.1:18000/api/v1
|
||||
# export API_KEY=...
|
||||
# ./scripts/insight_smoke.sh
|
||||
set -euo pipefail
|
||||
|
||||
API_BASE="${API_BASE:-http://127.0.0.1:18000/api/v1}"
|
||||
CYCLE_A="${CYCLE_A:-1}"
|
||||
KANDANG_A="${KANDANG_A:-1}"
|
||||
CYCLE_B="${CYCLE_B:-2}"
|
||||
KANDANG_B="${KANDANG_B:-2}"
|
||||
TOPIC="${TOPIC:-eef}"
|
||||
AUTH_HEADER=()
|
||||
if [[ -n "${API_KEY:-}" ]]; then
|
||||
AUTH_HEADER=(-H "X-API-Key: ${API_KEY}")
|
||||
fi
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
FIXTURE_A="${ROOT}/fixtures/insight/kandang-01.json"
|
||||
FIXTURE_B="${ROOT}/fixtures/insight/kandang-02.json"
|
||||
|
||||
echo "== Health =="
|
||||
curl -fsS "${API_BASE}/health/" | head -c 400; echo
|
||||
|
||||
echo "== RAG health (optional) =="
|
||||
curl -fsS "${RAG_URL:-http://127.0.0.1:5002}/health" || echo "RAG not up — generate may fall back without SOP chunks"
|
||||
|
||||
echo "== Ollama tags (optional) =="
|
||||
curl -fsS "${OLLAMA_URL:-http://127.0.0.1:11434}/api/tags" | head -c 400 || echo "Ollama not up — expect local_fallback"
|
||||
echo
|
||||
|
||||
gen() {
|
||||
local cycle="$1" kandang="$2" fixture="$3" force="$4"
|
||||
local ctx
|
||||
ctx="$(python - <<PY
|
||||
import json
|
||||
ctx=json.load(open(r'''${fixture}''', encoding='utf-8'))
|
||||
ctx['kandangId']=int('${kandang}')
|
||||
ctx['cycleId']=int('${cycle}')
|
||||
print(json.dumps(ctx, ensure_ascii=False))
|
||||
PY
|
||||
)"
|
||||
curl -fsS -X POST "${API_BASE}/ai-insights/generate/" \
|
||||
"${AUTH_HEADER[@]}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"cycle_id\":${cycle},\"kandang_id\":${kandang},\"topic\":\"${TOPIC}\",\"report_type\":\"page\",\"report_period\":\"smoke\",\"force_refresh\":${force},\"context\":${ctx}}"
|
||||
}
|
||||
|
||||
echo "== Generate Kandang A =="
|
||||
OUT_A="$(gen "$CYCLE_A" "$KANDANG_A" "$FIXTURE_A" true)"
|
||||
echo "$OUT_A" | head -c 500; echo
|
||||
|
||||
echo "== Generate Kandang B =="
|
||||
OUT_B="$(gen "$CYCLE_B" "$KANDANG_B" "$FIXTURE_B" true)"
|
||||
echo "$OUT_B" | head -c 500; echo
|
||||
|
||||
echo "== Cache hit Kandang A (force_refresh=false) =="
|
||||
OUT_A2="$(gen "$CYCLE_A" "$KANDANG_A" "$FIXTURE_A" false)"
|
||||
echo "$OUT_A2" | head -c 300; echo
|
||||
|
||||
python - <<PY
|
||||
import json
|
||||
a=json.loads('''${OUT_A}''')
|
||||
b=json.loads('''${OUT_B}''')
|
||||
a2=json.loads('''${OUT_A2}''')
|
||||
assert a.get('source') in ('generated','local_fallback','cache')
|
||||
assert b.get('source') in ('generated','local_fallback','cache')
|
||||
assert a2.get('source') == 'cache' or a2.get('insight_text') == a.get('insight_text')
|
||||
assert a.get('insight_text') != b.get('insight_text') or a.get('summary') != b.get('summary'), 'A/B text must differ (anti bleed)'
|
||||
print('SMOKE OK: A→B→A cache / no cross-kandang bleed')
|
||||
PY
|
||||
Reference in new issue
Block a user