Миграция с wireguard на amneziawg
После каких-то очередных манипуляций на Ростелекоме мой wireguarg туннель приказал долго жить (как и IPv6 почему-то), поэтому перехожу на amneziawg. Amneziawg - это форк wg поддерживающий добавление шума в стандартный протокол wireguard. Понятно, что в час Х, когда государство решит закрутить гайки, этот протокол будет легко забанен, но пока он работает и можно пользоваться. На крайний случай останется wg через vless, хотя скорость в таком случае не очень. Установка в Ubuntu Включаем источники src пакетов (deb-src) в /etc/apt/sources.list.d/ubuntu.sources ...
Shell доступ к хосту через LLM и мини-игра
Разбираясь с ollama и моделью llama3.1 увидел в документации, что ollama для некоторых моделей поддерживает вызов функций. Если коротко - модели под капотом передается JSON описывающий набор функций доступных ей для выполнения. Так можно добавить модели функцию получения информации из внешних источников или взаимодействия с какими-то системами. В документации приводят функцию получения текущей погоды для указанного города: [ { "type": "function", "function": { "name": "get_current_weather", "description": "Get the current weather for a city", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "The name of the city", }, }, "required": ["city"], }, }, }, Простой код для использования функции будет примерно таким: ...
Как запустить Flux с помощью ComfyUI на 12ГБ VRAM
В инфополе ворвалась новая диффузионная модель Flux и порвала всех конкурентов. Из своих тестов и того, что видел на Reddit, изображения значительно лучше, особенно в плане анатомии и злосчастных рук, чем то, что делает Stable Diffusion. Модель доступна в двух вариантах Schnell (разрешено использование в коммерческих проектах) и Dev (не для коммерческого использования). Обе версии имеют один размер, но Schnell генерирует изображения за меньшее число шагов и немного худшего качества чем Dev. Модели значительно больше по размеру чем SDXL и новая (неудачная) SD3, и весят почти 24ГБ. ...
Синхронизация Obsidian [upd]
Это новая версия предыдущей заметки про синхронизацию Obsidian с помощью плагина LiveSync т.к. плагин обновился, плюс более подробно опишу настройку CouchDB. Установка и настройка CouchDB Запускать базу будем в docker. Создаем директории для хранения: mdkir -p ~/docker/couchdb/data cd ~/docker/couchdb Создаем docker-compose.yaml version: "3" services: couchserver: image: couchdb:3.3 ports: - "127.0.0.1:5984:5984" environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=COUCH-ADMIN-PASS # ваш админский пароль для доступа к серверу volumes: - ./data:/opt/couchdb/data restart: always docker compose up -d Публикуем CouchDB через nginx: ...
Добавляем ИИ боту распознавание голосовых сообщений
В продолжение предыдущей заметки давайте сделаем ещё один шаг и добавим возможность боту отвечать текстом на голосовые сообщения. Для распознования голоса будем использовать python обертку над whisper.cpp. Более подробно как работает бот смотрите предыдущий пост, тут я сделаю небольшой рефакторинг и добавлю новый обработчик для голосовых. Устанавливаем зависимости deep-translator==1.11.4 llama_cpp_python==0.2.77 loguru==0.7.2 python-dotenv==1.0.1 requests==2.32.3 telebot==0.0.5 whisper_cpp_python==0.2.0 import datetime import os from uuid import uuid4 import requests import telebot from deep_translator import GoogleTranslator from dotenv import load_dotenv from llama_cpp import Llama from loguru import logger from telebot.types import Message from whisper_cpp_python import Whisper load_dotenv() TG_TOKEN = os.getenv("TG_TOKEN") bot = telebot.TeleBot(TG_TOKEN) # Загружаем llama-3 модель llm = Llama( model_path="./models/llama3/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf", chat_format="llama-3", verbose=False, # n_gpu_layers=-1, # Uncomment to use GPU acceleration # seed=1337, # Uncomment to set a specific seed # n_ctx=2048, # Uncomment to increase the context window ) # Загружаем whisper.cpp модель whisper_model = Whisper(model_path="./models/whisper/ggml-base.bin") # Словарь для хранения историй сообщений user_message_history = {} # Стартовое сообщение бота @bot.message_handler(commands=["start", "help"]) def send_welcome(message: Message): bot.send_message(message.chat.id, "Я ИИ бот на базе llama-3. Можешь отправить мне текстовое или голосовое сообщение.") # Вынесем логику работы с историей сообщений и llama моделью в отдельную функцию def create_chat_completion(user_id, text): # Получаем историю сообщений текущего пользователя user_history = user_message_history.get(user_id, []) user_history.append({"role": "user", "content": text}) # Добавим в контекст текущую дату и время current_date_time = datetime.datetime.now().strftime("%d %B %Y, %H:%M MSK") messages = [ { "role": "system", "content": f"Ты полезный ИИ помощник.\nТекущая дата: {current_date_time}", }, ] for msg in user_history[-10:]: messages.append(msg) out = llm.create_chat_completion(messages) reply = out["choices"][0]["message"]["content"] logger.info(f"assistant: {reply}") # Добавляем ответ бота в историю текущего пользователя user_history.append({"role": "assistant", "content": reply}) user_message_history[user_id] = user_history[-20:] return reply # Обработчик текстовых сообщений @bot.message_handler(content_types=["text"]) def message_handler(message: Message): chat_id = message.chat.id user_id = message.from_user.id logger.info(f"user {user_id}: {message.text}") bot.send_chat_action(chat_id, "typing") reply = create_chat_completion(user_id, message.text) # Отправляем ответ пользователю bot.send_message(chat_id, reply) Добавляем обработчик голосовых сообщений ...
Простой llama-3 телеграм бот
В заметке расскажу как на python сделать простого чат бота для телеграм на базе последней версии llm модели llama-3. Предположим у нас уже установлен python и CUDA (если хотите использовать gpu для ускорения). Для взаимодействия с моделью на python есть несколько вариантов, чтобы не усложнять будем использовать библиотеку llama.cpp и квантованную модель в формате GGUF. Обратите внимание, нужна Instruct версия. Подготовка В телеграм с помощью @BotFather создайте нового бота и получите токен. ...
Forgejo Actions в Podman и Quadlet
Только обнаружил, что уже год Forgejo поддерживает экшены на подобии Github Actions для автоматического запуска ci/cd пайплайнов. Пайплайны по синтаксису совместимы с Github и поддерживают готовые Github экшены https://github.com/marketplace?type=actions. У меня изначально ci/cd был реализован на Forgejo + Drone, потом Drone был заменен на Woodpecker (форк Drone), ну а затем собственно увидел, что появился встроенный механизм и перешел на него. Для работы экшен модуль должен быть включен в конфиге Forgejo: [actions] ENABLED = true DEFAULT_ACTIONS_URL = github ZOMBIE_TASK_TIMEOUT = 10m ENDLESS_TASK_TIMEOUT = 3h ABANDONED_JOB_TIMEOUT = 24h SKIP_WORKFLOW_STRINGS = [skip ci],[ci skip],[no ci],[skip actions],[actions skip] Так же как в Github за работу экшен отвечают ранеры, которые могут быть запущены как обычные приложения, либо в Docker-контейнере. Во втором случае в контейнер монтируют docker.sock хоста для запуска ранером контейнеров с задачами. Всё это прекрасно работало пока не решил отказаться от Docker и перейти на Podman. ...