#!/bin/bash set -euo pipefail # ===================================================================== # تحديث: تم الانتقال من تنزيل ملف GGUF يدويًا من Hugging Face إلى استخدام # نموذج Gemma 4 الرسمي المتوفر مباشرة في مكتبة Ollama (gemma4) — أبسط # وأكثر ثباتًا، ويتضمن دعم الرؤية تلقائيًا بدون ملف mmproj منفصل. # كما تمت إضافة أدوات Open WebUI: بحث الويب، تنفيذ الأكواد، واستدعاء # الأدوات بالطريقة الأصلية (Native Function Calling) التي يدعمها Gemma 4. # ===================================================================== # تحديد مسارات المخزن الدائم (في مساحات HF عادة يكون /data) OLLAMA_DATA_DIR="/data/ollama" WEBUI_DATA_DIR="/data/webui" # نموذج Gemma 4 من مكتبة Ollama الرسمية (يمكن تغييره عبر متغير بيئة بدون إعادة بناء الصورة) # الخيارات المتاحة: e2b (الأخف ~7.2GB) | e4b (~9.6GB) | 12b | 26b (MoE) | 31b BASE_MODEL="${BASE_MODEL:-gemma4:e2b}" OLLAMA_MODEL_NAME="${OLLAMA_MODEL_NAME:-my-gemma}" # سياق المحادثة: الحد الأقصى لـ e2b/e4b هو 128000، و256000 لما هو أكبر (12b/26b/31b) # قلّل هذا الرقم إذا كانت موارد المساحة (RAM) محدودة وواجهت مشاكل في الذاكرة NUM_CTX="${NUM_CTX:-128000}" NUM_THREAD="${NUM_THREAD:-$(nproc)}" # ---------------------- إعدادات أدوات Open WebUI ---------------------- # بحث الويب عبر DuckDuckGo (لا يحتاج مفتاح API) export ENABLE_WEB_SEARCH="${ENABLE_WEB_SEARCH:-true}" export WEB_SEARCH_ENGINE="${WEB_SEARCH_ENGINE:-duckduckgo}" export WEB_SEARCH_RESULT_COUNT="${WEB_SEARCH_RESULT_COUNT:-3}" export WEB_SEARCH_CONCURRENT_REQUESTS="${WEB_SEARCH_CONCURRENT_REQUESTS:-1}" export USER_AGENT="${USER_AGENT:-Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36}" # منفّذ الأكواد المدمج (Pyodide) - مفعّل افتراضيًا في Open WebUI، موضوع هنا للوضوح والتأكيد export ENABLE_CODE_EXECUTION="${ENABLE_CODE_EXECUTION:-true}" export ENABLE_CODE_INTERPRETER="${ENABLE_CODE_INTERPRETER:-true}" # تفعيل استدعاء الأدوات بالطريقة "الأصلية" (Native) التي يدعمها Gemma 4 أصلاً # (هذا ما يجعل بحث الويب وتنفيذ الأكواد تعمل بشكل موثوق مع النموذج) if [ -z "${DEFAULT_MODEL_PARAMS:-}" ]; then DEFAULT_MODEL_PARAMS='{"function_calling": "native"}' fi export DEFAULT_MODEL_PARAMS # إنشاء المجلدات المطلوبة في المخزن إن لم تكن موجودة mkdir -p "$OLLAMA_DATA_DIR" "$WEBUI_DATA_DIR" # تشغيل خادم Ollama في الخلفية echo "Starting Ollama server..." OLLAMA_MODELS="$OLLAMA_DATA_DIR" ollama serve & # الانتظار حتى يصبح خادم Ollama جاهزًا فعليًا لتلقي الطلبات # (بدل الانتظار الثابت sleep 4 في النسخة السابقة، وهو غير موثوق) echo "Waiting for Ollama to be ready..." for i in $(seq 1 60); do if ollama list >/dev/null 2>&1; then echo "Ollama server is ready." break fi sleep 1 done if ! ollama list >/dev/null 2>&1; then echo "ERROR: Ollama server did not become ready in time." >&2 exit 1 fi # تنزيل نموذج Gemma 4 من مكتبة Ollama الرسمية # هذه العملية آمنة لإعادة التشغيل تلقائيًا: إذا كانت طبقات النموذج موجودة # بالفعل في $OLLAMA_DATA_DIR فلن تُعاد تنزيلها echo "Pulling $BASE_MODEL..." ollama pull "$BASE_MODEL" # إنشاء ملف إعدادات النموذج (Modelfile) لتوسيع سياق المحادثة وضبط عدد المسارات echo "Creating Modelfile..." cat < /tmp/Modelfile FROM $BASE_MODEL PARAMETER num_ctx $NUM_CTX PARAMETER num_thread $NUM_THREAD EOF # تسجيل النموذج المخصص داخل Ollama echo "Registering model '$OLLAMA_MODEL_NAME' with Ollama..." ollama create "$OLLAMA_MODEL_NAME" -f /tmp/Modelfile # تشغيل واجهة Open WebUI (الأمر الافتراضي للصورة الأساسية) echo "Starting Open WebUI..." cd /app/backend exec bash start.sh