#!/bin/bash # Seed the training-traces dataset by running a curated batch of Hebrew # legal queries through the live server. Each query goes through the full # pipeline (retrieval → generate → log) and is auto-saved to traces.jsonl. # # Usage: # ./scripts/seed_traces.sh # run all 60 questions # ./scripts/seed_traces.sh --max 20 # cap at 20 # ./scripts/seed_traces.sh --slow # 2s between queries (default 0.8) # # Why a separate script? zsh + Hebrew + question marks + `?` glob expansion # is a recipe for silent failures when copy-pasting heredocs from chat. # This script delegates JSON-body construction to Python so quoting just # works. set -e API="${API:-http://127.0.0.1:8000}" MAX="" SLEEP="0.8" while [[ $# -gt 0 ]]; do case "$1" in --max) MAX="$2"; shift 2 ;; --slow) SLEEP="2"; shift ;; *) echo "Unknown arg: $1"; exit 1 ;; esac done # All questions, one per line. Hebrew is fine here — bash reads them as # bytes and Python serializes to JSON properly. QUESTIONS=$(cat << 'QEOF' מה אומר סעיף 1 לחוק החוזים? מה אומר סעיף 2 לחוק החוזים? מה אומר סעיף 5 לחוק החוזים? מה אומר סעיף 8 לחוק החוזים? מה אומר סעיף 11 לחוק החוזים? מה אומר סעיף 13 לחוק החוזים? מה אומר סעיף 16 לחוק החוזים? מה אומר סעיף 19 לחוק החוזים? מה אומר סעיף 20 לחוק החוזים? מה אומר סעיף 24 לחוק החוזים? מה אומר סעיף 26 לחוק החוזים? מה אומר סעיף 27 לחוק החוזים? מה אומר סעיף 41 לחוק החוזים? מה אומר סעיף 45 לחוק החוזים? מה אומר סעיף 53 לחוק החוזים? מה אומר סעיף 1 לחוק התרופות? מה אומר סעיף 2 לחוק התרופות? מה אומר סעיף 3 לחוק התרופות? מה אומר סעיף 4 לחוק התרופות? מה אומר סעיף 6 לחוק התרופות? מה אומר סעיף 10 לחוק התרופות? מה אומר סעיף 11 לחוק התרופות? מה אומר סעיף 14 לחוק התרופות? מה אומר סעיף 15 לחוק התרופות? מה אומר סעיף 16 לחוק התרופות? מה אומר סעיף 1 לחוק המכר? מה אומר סעיף 6 לחוק המכר? מה אומר סעיף 11 לחוק המכר? מה אומר סעיף 14 לחוק המכר? מה אומר סעיף 1 לחוק השכירות? מה אומר סעיף 7 לחוק השכירות? מה אומר סעיף 2 לחוק החוזים האחידים? מה אומר סעיף 3 לחוק החוזים האחידים? הלכת אפרופים הלכת בית יולס הלכת קל בנין הלכת קלינור הלכת מבטחים מה זה תום לב? מה זה הפרה יסודית? מה זה אכיפה במשפט? מה זה ביטול חוזה? מה זה השבה? מה זה פיצויי קיום? מה זה פיצויי הסתמכות? מה זה חופש החוזה? מה זה תקנת הציבור? מה זה חוזה למראית עין? האם מותר לבטל חוזה ללא הודעה מראש? מה התרופות העומדות לרשות צד שנפגע מהפרת חוזה? איך נבדקת תכלית חוזה? מתי בית המשפט יאכוף חוזה? מה ההבדל בין פיצויי קיום לפיצויי הסתמכות? האם חוזה בעל-פה תקף? מתי חוזה נחשב פסול? איך מוכיחים תום לב? מה ההבדל בין סעיף 12 לסעיף 39? מה ההבדל בין אכיפה לביטול? מה ההבדל בין חוזה אחיד לחוזה רגיל? מה ההבדל בין הפרה רגילה להפרה יסודית? QEOF ) # Convert to array, portable across bash 3.2 (macOS) and bash 4+ # (mapfile is bash 4+ only — macOS still ships with 3.2.x). QARRAY=() while IFS= read -r line; do QARRAY+=("$line") done <<< "$QUESTIONS" if [ -n "$MAX" ]; then QARRAY=("${QARRAY[@]:0:$MAX}") fi TOTAL=${#QARRAY[@]} echo "▸ Sending $TOTAL queries to $API ..." echo "" OK=0 FAIL=0 START=$(date +%s) i=0 for Q in "${QARRAY[@]}"; do i=$((i+1)) [ -z "$Q" ] && continue # Build JSON body via Python — handles Hebrew, ?, ", \, etc. BODY=$(python3 -c "import json,sys; print(json.dumps({'query': sys.argv[1], 'top_k': 3}, ensure_ascii=False))" "$Q") HTTP=$(curl -s -o /tmp/seed_resp.json -w "%{http_code}" \ -X POST "$API/v1/query" \ -H "Content-Type: application/json; charset=utf-8" \ --data-binary "$BODY") if [ "$HTTP" = "200" ]; then OK=$((OK+1)) # truncate Hebrew safely — count chars not bytes SHORT=$(echo "$Q" | python3 -c "import sys; t=sys.stdin.read().strip(); print(t[:60])") printf " ✓ %3d/%d %s\n" "$i" "$TOTAL" "$SHORT" else FAIL=$((FAIL+1)) SHORT=$(echo "$Q" | python3 -c "import sys; t=sys.stdin.read().strip(); print(t[:50])") printf " ✗ %3d/%d HTTP %s — %s\n" "$i" "$TOTAL" "$HTTP" "$SHORT" fi sleep "$SLEEP" done ELAPSED=$(( $(date +%s) - START )) echo "" echo "Done in ${ELAPSED}s — ✓ $OK ✗ $FAIL" echo "" echo "▸ Training data summary:" curl -s "$API/v1/training_data/summary" | python3 -m json.tool