82 lines
2.0 KiB
Bash
Executable File
82 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ollama_base_url=${OLLAMA_BASE_URL:-http://embedding:11434}
|
|
ollama_model=${OLLAMA_MODEL:?OLLAMA_MODEL must be projected from installation modelCatalog}
|
|
wait_timeout_sec=${OLLAMA_WAIT_TIMEOUT_SEC:-180}
|
|
|
|
case "$wait_timeout_sec" in
|
|
''|*[!0-9]*)
|
|
echo "OLLAMA_WAIT_TIMEOUT_SEC must be an integer number of seconds" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case "$ollama_base_url" in
|
|
http://*)
|
|
host_and_path=${ollama_base_url#http://}
|
|
;;
|
|
*)
|
|
echo "OLLAMA_BASE_URL must use http://" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
host_port=${host_and_path%%/*}
|
|
ollama_host=${host_port%%:*}
|
|
ollama_port=${host_port##*:}
|
|
if [[ "$host_port" == "$ollama_host" ]]; then
|
|
ollama_port=80
|
|
fi
|
|
|
|
deadline=$((SECONDS + wait_timeout_sec))
|
|
export OLLAMA_HOST="$ollama_base_url"
|
|
|
|
fetch_tags() {
|
|
local response body
|
|
response=$(
|
|
exec 3<>"/dev/tcp/$ollama_host/$ollama_port"
|
|
printf 'GET /api/tags HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n' "$ollama_host" >&3
|
|
cat <&3
|
|
) || return 1
|
|
[[ "$response" == *$' 200 '* || "$response" == HTTP/1.1$' 200'* || "$response" == HTTP/1.0$' 200'* ]] || return 1
|
|
body=${response#*$'\r\n\r\n'}
|
|
if [[ "$body" == "$response" ]]; then
|
|
body=${response#*$'\n\n'}
|
|
fi
|
|
printf '%s' "$body"
|
|
}
|
|
|
|
model_present() {
|
|
local compact_json
|
|
compact_json=$(printf '%s' "$1" | tr -d '[:space:]')
|
|
grep -Fq "\"name\":\"$ollama_model\"" <<<"$compact_json"
|
|
}
|
|
|
|
wait_for_tags() {
|
|
local tags_json
|
|
while (( SECONDS <= deadline )); do
|
|
if tags_json=$(fetch_tags 2>/dev/null); then
|
|
printf '%s' "$tags_json"
|
|
return 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "timed out waiting for Ollama tags at $ollama_base_url/api/tags" >&2
|
|
return 1
|
|
}
|
|
|
|
tags_json=$(wait_for_tags)
|
|
if model_present "$tags_json"; then
|
|
echo "embedding model already cached: $ollama_model"
|
|
exit 0
|
|
fi
|
|
|
|
ollama pull "$ollama_model"
|
|
tags_json=$(fetch_tags)
|
|
model_present "$tags_json" || {
|
|
echo "embedding model missing after pull: $ollama_model" >&2
|
|
exit 1
|
|
}
|
|
echo "embedding model ready: $ollama_model"
|