--- title: "Nextcloud Assistant ← LiteLLM ← Ollama" date: "2024-07-19" author: Сисадмин Линк tags: ["ai", "nextcloud", "litellm", "ollama"] description: "Настройка локального ИИ для Nextcloud Assistant через прослойку LiteLLM" cover: "/posts/covers/nlo.avif" --- Опять же, как было в случае с [принтером](/posts/ricoh_config), у меня Arch-based дистрибутив, поэтому буду расписывать по нему. Начнём с установки **[Ollama](https://github.com/ollama/ollama)**. У меня карточка от красных, поэтому я ставлю версию **rocm**. ```bash yay -S ollama-rocm ``` или если нет **yay** ```bash sudo pacman -S ollama-rocm ``` Как в моём случае, почему-то оно не подхватывало мою **RX 6700 XT** (но [тут](https://github.com/ollama/ollama/issues/3547) нашлось решение), поэтому мне пришлось редактировать **сервис systemd** следующим образом: ```bash sudo systemctl edit --full ollama ``` ```bash [Unit] Description=Ollama Service Wants=network-online.target After=network.target network-online.target [Service] ExecStart=/usr/bin/ollama serve WorkingDirectory=/var/lib/ollama Environment="HOME=/var/lib/ollama" Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0" # Добавлено, чтобы увидело карточку Environment="OLLAMA_HOST=0.0.0.0" # Возможность локально подключатся извне User=ollama Group=ollama Restart=on-failure RestartSec=3 Type=simple PrivateTmp=yes ProtectSystem=full ProtectHome=yes [Install] WantedBy=multi-user.target ``` Обн. от `05.08.24` - добавлена инструкция импорта моделей `.gguf` Далее устанавливаем желаемую модель, в моём случае это **`llama3`** и модель, которую можно импортировать из файла `.gguf`, я буду использовать **`saiga-llama3`[[🔗](https://huggingface.co/IlyaGusev/saiga_llama3_8b_gguf)]**. ```bash ollama pull llama3 ``` Для того, чтобы импортировать модель, нам необходимо: - Загрузить модель 🙃 - Создать файл, который можно скормить **ollama** ```bash echo FROM папка_с_моделью/файл_модели.gguf >> файл_название_модели ``` В моём случае можно сразу название модели, потому что работаю сразу из папки с моделью ```bash echo FROM saiga_llama3.gguf >> saiga-llama3 ``` Осталось импортировать ```bash ollama -f файл_название_модели название_модели ``` ```bash ollama -f saiga-llama3 saiga-llama3 ``` Модели импортированы --- Далее идём ставить **[LiteLLM](https://github.com/BerriAI/litellm)**. Это прослойка между Ollama и [Nextcloud LocalAI](https://github.com/nextcloud/integration_openai), которая использует запросы в формате OpenAI API. ```bash pipx install 'litellm[proxy]' ``` Нам нужна именно **`litellm[proxy]`**, а не просто **`litellm`**! Теперь нужно собственно, запустить модели, с которыми впоследствии мы будем общаться через [Nextcloud Assistant](https://github.com/nextcloud/assistant). \ Однако, перед тем, как мы перейдём к запуску наших моделей, нам нужно создать файлик **`config.yaml`**, который мы впоследствии "скормим" **LiteLLM** со следующим содержимым: ```bash model_list: - model_name: llama3 litellm_params: model: ollama/llama3 - model_name: qwen2 litellm_params: model: ollama/qwen2 # ну далее по шаблону, если есть другие модели ``` Затем я сделал **systemd** сервис, чтобы не запускать это дело ручками, он должен располагаться в ```bash /home/ваш_пользователь/.config/systemd/user/litellm.service ``` ```bash [Unit] Description=LiteLLM for Ollama [Service] ExecStart=/home/ваш_пользователь/.local/bin/litellm --config путь_до/config.yaml Restart=on-failure RestartSec=5s [Install] WantedBy=default.target ``` Далее ```bash systemctl --user daemon-reload systemctl --user enable --now litellm ``` Теперь идём в настройки сервера **Искусственный интеллект** [/settings/admin/ai], предварительно установив **Nextcloud Assistant** и **OpenAI and LocalAI integration**, листаем ниже до **`OpenAI и локальная интеграция`**. ```bash Service URL - ip_пк:4000 Service Name (optional) - LiteLLM (или другое, какое хотите) API key - не нужен Default completion model to use - выбираем ollama/ваша_модель (openai) Max new tokens per request - я поставил 17500, но это уже индивидуально Select enabled features отключил: Image generation provider Speech-to-text потому что модель такое не умеет ``` Статья написана без использования ИИ. Хотя, наверное, это и так видно 🙃