#!/bin/bash # Скрипт для тестирования vision capabilities модели gemma3n:e4b-it-fp16 set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TEST_DIR="$PROJECT_DIR/test_images" IMAGE_URL="https://yandex-images.clstorage.net/PU5vN2154/532297ZKm/lCuSfyMn0DdbJqcFVeFiB9Ti31Te2dZ1EepiRw3Cs0Qw8cQ1ND5OQRKC1yH4LnhdRtloQ4aXHng5ZSLNmXHy_8k293YSMsBWKnOvYAXBbhPcl6pYmqi-ZGWDazZo2pYkJNHpkJHrg5yiO0bEOIeEICe5cFqrojYgyNQ6mHj4e5IUb_Lri3uxo9fmXv0dMf7f1NvH9J5YVsyhRvvmtD9eTc1QfVxV42d8OotKrLTDfHx7jfDqjpIqHAyt9ngIIHsSjLtOJ7_jTYdHLn4hJWlCj_jj69gGlApIBYaTfoxPrtHFDGlYUd-PjHI3hijAm6hIb-lUFlpOehQAJTbwEGwjcqjjVns323WrR2q6CalVyg9kZ8s0jkBm8OVGr26UH86NHaD1rKnPH6zinwJIKBv8VEdF_FrGLt6QFOVqFOQY776w47YDNy8Biwfefg0lxVaL2E9L5NbAztwh8vuCcMNSEfG8aYQFBxe0Eu9CMPhz1Axz1dgqmkpSYCAR8nSA_GMSKKPa9-tzIUc7ooKthV1ykwSjrzhORKq0eRrvBlTbajF5yAUoVX-7XM7HouyU51xMaxFMBl7atixQFW4o1BznMoi_chuL8_mTO_IKce21CosEQ6Owkkhi9EGSz5pIE56NjURBxKn7pwTKt6K4FB_YYHexZG4qlsIg8GVaiJyIB0p0bx5PF4_FIy-SItWZId5f8M9_RIqg2hRVCqP2hDvSfWGAYUjJd6c8lr9mgGj7kPQbVQBCUgIm1NB9lsxQrIO-wO92fytbOQsjjiqBqa0CK9Qjy6wi6CoIfX5vZjw_pj1BKGm0UVOXuArPFngIN2AUgz3w4mZSTvz8IQYo_IhPVlQ7PiOjhyWD6wZSVZ3NDrvsC-8w4lxmzE32T1qMuy5JOTRxaNHHH0QCp4IkgMv8LH8JeJaOUj4sVOGCBBgQi5KMX74TQzOBW9cGTu35UZr3qAfj5O6kMogxjqNanMOs" IMAGE_FILE="$TEST_DIR/test_image.jpg" MODEL="gemma3n:e4b-it-fp16" echo "=== Тестирование Vision Capabilities модели $MODEL ===" echo "" # Определяем команду docker (с sudo или без) DOCKER_CMD="docker" if ! docker ps >/dev/null 2>&1; then DOCKER_CMD="sudo docker" fi # Проверка контейнера Ollama echo "1. Проверка контейнера Ollama..." if ! $DOCKER_CMD ps --format '{{.Names}}' 2>/dev/null | grep -q "^ollama$"; then echo " ✗ Ошибка: Контейнер ollama не запущен" echo " Запустите: docker compose up -d ollama" exit 1 fi echo " ✓ Контейнер ollama запущен" # Проверка модели echo "" echo "2. Проверка загруженных моделей..." MODELS=$($DOCKER_CMD exec ollama ollama list 2>/dev/null) if echo "$MODELS" | grep -q "$MODEL"; then echo " ✓ Модель $MODEL найдена" echo "$MODELS" | grep "$MODEL" else echo " ✗ Модель $MODEL не найдена" echo " Загрузите модель: docker exec ollama ollama pull $MODEL" exit 1 fi # Создаем директорию для тестовых изображений mkdir -p "$TEST_DIR" cd "$TEST_DIR" # Скачиваем изображение echo "" echo "3. Подготовка тестового изображения..." if [ ! -f "$IMAGE_FILE" ]; then echo " Скачиваю изображение..." curl -L -o "$IMAGE_FILE" "$IMAGE_URL" || { echo " ✗ Ошибка: не удалось скачать изображение" exit 1 } echo " ✓ Изображение скачано: $IMAGE_FILE" else echo " ✓ Изображение уже существует: $IMAGE_FILE" fi # Проверяем размер файла if [ -f "$IMAGE_FILE" ]; then FILE_SIZE=$(stat -c%s "$IMAGE_FILE" 2>/dev/null || stat -f%z "$IMAGE_FILE" 2>/dev/null) echo " Размер файла: $(numfmt --to=iec-i --suffix=B $FILE_SIZE 2>/dev/null || echo "${FILE_SIZE} bytes")" # Проверяем тип файла FILE_TYPE=$(file "$IMAGE_FILE" 2>/dev/null | cut -d: -f2) echo " Тип файла: $FILE_TYPE" fi # Кодируем изображение в base64 echo "" echo "4. Кодирование изображения в base64..." IMAGE_B64=$(base64 -w 0 "$IMAGE_FILE" 2>/dev/null || base64 "$IMAGE_FILE" | tr -d '\n') B64_LENGTH=${#IMAGE_B64} echo " ✓ Изображение закодировано (длина: $B64_LENGTH символов)" # Отправляем запрос к Ollama API echo "" echo "5. Отправка запроса к Ollama API..." echo " Модель: $MODEL" echo " Промпт: Опиши это изображение на русском языке. Что ты видишь на картинке?" echo "" # Отправляем запрос через Docker exec к Ollama API # Используем временный файл для передачи большого base64 echo " Отправка запроса (это может занять некоторое время)..." TEMP_FILE=$(mktemp) cat > "$TEMP_FILE" </dev/null 2>&1 RESPONSE=$($DOCKER_CMD exec ollama sh -c "curl -s --max-time 120 -X POST http://localhost:11434/api/generate \ -H 'Content-Type: application/json' \ -d @/tmp/request.json" 2>&1) # Удаляем временный файл rm -f "$TEMP_FILE" # Проверяем ответ if echo "$RESPONSE" | grep -q '"response"'; then echo " ✓ Успешно! Ответ модели:" echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # Извлекаем ответ более надежным способом echo "$RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('response', ''))" 2>/dev/null || \ echo "$RESPONSE" | grep -o '"response":"[^"]*"' | sed 's/"response":"\(.*\)"/\1/' | sed 's/\\n/\n/g' | sed 's/\\"/"/g' | head -20 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo "=== ✓ Тест завершен успешно! Vision работает! ===" elif echo "$RESPONSE" | grep -q "error\|Error\|ERROR"; then echo " ✗ Ошибка при запросе к API:" echo "$RESPONSE" | grep -i error || echo "$RESPONSE" echo "" echo "Проверьте:" echo " 1. Логи Ollama: $DOCKER_CMD logs ollama --tail 30" echo " 2. Поддерживает ли модель vision: $DOCKER_CMD exec ollama ollama show $MODEL" else echo " ⚠ Неожиданный ответ от API:" echo "$RESPONSE" echo "" echo "Попробуйте проверить через веб-интерфейс Open WebUI" fi echo "" echo "6. Инструкции для тестирования через веб-интерфейс:" echo "" echo " Шаг 1: Откройте Open WebUI: https://odo.iieasy.ru" echo " Шаг 2: Выберите модель: $MODEL" echo " Шаг 3: Найдите кнопку загрузки изображения в поле ввода (📎 или 📷)" echo " Шаг 4: Загрузите изображение: $IMAGE_FILE" echo " Шаг 5: Задайте вопрос: \"Опиши это изображение на русском языке. Что ты видишь?\"" echo "" echo "Файл изображения: $IMAGE_FILE"