| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| source scripts/_env.sh |
|
|
| MODEL_DIR="${MODEL_DIR:-models}" |
| DOWNLOAD_MODE="download" |
|
|
| while [[ $# -gt 0 ]]; do |
| case "$1" in |
| --model-dir) |
| MODEL_DIR="$2" |
| shift 2 |
| ;; |
| --no-download) |
| DOWNLOAD_MODE="skip" |
| shift |
| ;; |
| -h|--help) |
| cat <<'EOF' |
| Usage: scripts/start_llamacpp.sh [--model-dir models] [--no-download] |
|
|
| Starts local llama.cpp OpenAI-compatible servers: |
| 8080: agent orchestrator |
| 8082: receipt parser |
|
|
| Models are stored in the repo-local models/ directory by default. |
| EOF |
| exit 0 |
| ;; |
| *) |
| echo "Unknown argument: $1" >&2 |
| exit 2 |
| ;; |
| esac |
| done |
|
|
| export MODEL_DIR |
|
|
| if [[ "$DOWNLOAD_MODE" == "download" ]]; then |
| uv run python scripts/download_models.py |
| fi |
|
|
| ORCHESTRATOR_MODEL="$MODEL_DIR/llama-3.2-3b-instruct.Q4_K_M.gguf" |
| RECEIPT_MODEL="$MODEL_DIR/llama-3.2-3b-receipt.Q4_K_M.gguf" |
|
|
| if [[ ! -f "$ORCHESTRATOR_MODEL" || ! -f "$RECEIPT_MODEL" ]]; then |
| echo "Missing llama.cpp model files in $MODEL_DIR." >&2 |
| echo "Run scripts/start_llamacpp.sh without --no-download first." >&2 |
| exit 1 |
| fi |
|
|
| cleanup() { |
| jobs -p | xargs -r kill |
| } |
| trap cleanup EXIT INT TERM |
|
|
| echo "Starting llama.cpp orchestrator on http://127.0.0.1:8080/v1" |
| uv run python -m llama_cpp.server \ |
| --model "$ORCHESTRATOR_MODEL" \ |
| --host 127.0.0.1 --port 8080 \ |
| --n_ctx 2048 --n_threads 2 \ |
| --chat_format llama-3 & |
|
|
| echo "Starting llama.cpp receipt parser on http://127.0.0.1:8082/v1" |
| uv run python -m llama_cpp.server \ |
| --model "$RECEIPT_MODEL" \ |
| --host 127.0.0.1 --port 8082 \ |
| --n_ctx 2048 --n_threads 2 \ |
| --chat_format llama-3 & |
|
|
| echo "llama.cpp servers are starting. Press Ctrl-C to stop them." |
| wait |
|
|