Skip to main content
Glama
waifuai

MCP Waifu Queue

by waifuai

Очередь MCP Waifu

Этот проект реализует сервер MCP (Model Context Protocol) для разговорного ИИ-персонажа «вайфу», использующий API OpenRouter через очередь Redis для асинхронной обработки. Он использует библиотеку FastMCP для упрощенной настройки и управления сервером.

Содержание

Related MCP server: local-agent-context

Возможности

  • Генерация текста через OpenRouter с использованием модели из ~/.model-openrouter или openrouter/free.

  • Очередь запросов с использованием Redis для асинхронной обработки параллельных запросов.

  • API, совместимый с MCP, с использованием FastMCP.

  • Отслеживание статуса заданий через ресурсы MCP.

  • Конфигурация через переменные окружения (файл .env).

  • Загрузка ключей API:

    • OpenRouter: OPENROUTER_API_KEY или ~/.api-openrouter

  • Файлы выбора модели в домашней директории:

    • ~/.model-openrouter для имени модели OpenRouter

Архитектура

Проект состоит из нескольких ключевых компонентов:

  • main.py: Основная точка входа, инициализирующая приложение FastMCP и определяющая инструменты/ресурсы MCP.

  • respond.py: Содержит основную логику генерации текста с использованием API OpenRouter.

  • task_queue.py: Обрабатывает взаимодействие с очередью Redis (используя python-rq), ставя запросы на генерацию в очередь.

  • utils.py: Содержит вспомогательные функции, в частности call_predict_response, которая выполняется воркером для вызова логики генерации в respond.py.

  • worker.py: Воркер Redis (python-rq), который обрабатывает задания из очереди, вызывая call_predict_response.

  • config.py: Управляет конфигурацией с помощью pydantic-settings.

  • models.py: Определяет модели Pydantic для валидации запросов и ответов MCP.

Поток запроса выглядит следующим образом:

  1. Клиент отправляет запрос к инструменту MCP generate_text (определен в main.py).

  2. Инструмент ставит запрос (промпт) в очередь Redis (обрабатывается task_queue.py).

  3. Процесс worker.py забирает задание из очереди.

  4. Воркер выполняет функцию call_predict_response (из utils.py).

  5. call_predict_response вызывает функцию predict_responserespond.py), которая взаимодействует с API OpenRouter.

  6. Сгенерированный текст (или сообщение об ошибке) возвращается функцией predict_response и сохраняется как результат задания в RQ.

  7. Клиент может получить статус и результат задания, используя ресурс MCP job://{job_id} (определен в main.py).

graph LR
    subgraph Client
        A[User/Client] -->|1. Send Prompt via MCP Tool| B(mcp-waifu-queue: main.py)
    end
    subgraph mcp-waifu-queue Server
        B -->|2. Enqueue Job (prompt)| C[Redis Queue]
        B -->|7. Return Job ID| A
        D[RQ Worker (worker.py)] --|>| C
        D -->|3. Dequeue Job & Execute| E(utils.call_predict_response)
        E -->|4. Call Generation Logic| F(respond.predict_response)
        F -->|5. Call OpenRouter API| G[OpenRouter API]
        G -->|6. Return Response| F
        F --> E
        E -->|Update Job Result in Redis| C
        A -->|8. Check Status via MCP Resource| B
        B -->|9. Fetch Job Status/Result| C
        B -->|10. Return Status/Result| A
    end

Предварительные требования

  • Python 3.7+

  • pip или uv (установщик пакетов Python)

  • Сервер Redis (установлен и запущен)

  • Ключ API OpenRouter

Инструкции по установке Redis в вашей системе можно найти на официальном сайте Redis: https://redis.io/docs/getting-started/ Вы можете получить ключ API OpenRouter здесь: https://openrouter.ai/

Установка

  1. Клонируйте репозиторий:

    git clone <YOUR_REPOSITORY_URL>
    cd mcp-waifu-queue
  2. Создайте и активируйте виртуальное окружение с помощью uv:

    python -m uv venv .venv
    .venv/Scripts/python.exe -m ensurepip
    .venv/Scripts/python.exe -m pip install uv
  3. Установите зависимости:

    .venv/Scripts/python.exe -m uv pip install -r requirements.txt
    .venv/Scripts/python.exe -m uv pip install -r requirements-dev.txt

Конфигурация

  1. Имена моделей через файлы в $HOME:

    • Файл модели OpenRouter:

      echo "openrouter/free" > ~/.model-openrouter
  2. Ключи API: Предпочтительно через переменные окружения с резервным копированием в файл:

    • OpenRouter: OPENROUTER_API_KEY или ~/.api-openrouter GXP6

    (Замените YOUR_API_KEY_HERE на ваш реальный ключ)

  3. Другие настройки: Скопируйте файл .env.example в .env:

    cp .env.example .env
  4. Измените файл .env, чтобы задать остальные значения конфигурации:

    • MAX_NEW_TOKENS: Максимальное количество токенов для ответа (по умолчанию: 2048).

    • REDIS_URL: URL вашего сервера Redis (по умолчанию: redis://localhost:6379).

    • FLASK_ENV, FLASK_APP: Опционально, относится к Flask, если он используется где-то еще, не является основным для работы сервера/воркера MCP.

Запуск службы

  1. Убедитесь, что Redis запущен. Если вы установили его локально, вам может потребоваться запустить процесс сервера Redis (например, командой redis-server или через менеджер служб).

  2. Запустите воркер RQ: Откройте терминал, активируйте виртуальное окружение (source .venv/bin/activate или аналогично) и выполните:

    python -m mcp_waifu_queue.worker

    Эта команда запускает процесс воркера, который будет прослушивать задания в очереди Redis, определенной в вашем файле .env. Оставьте этот терминал запущенным.

  3. Запустите сервер MCP: Откройте другой терминал, активируйте виртуальное окружение и запустите сервер MCP с помощью инструмента типа uvicorn (возможно, вам потребуется установить его: pip install uvicorn или uv pip install uvicorn):

    uvicorn mcp_waifu_queue.main:app --reload --port 8000 # Example port

    Замените 8000 на желаемый порт. Флаг --reload полезен для разработки.

    Альтернативно, вы можете использовать скрипт start-services.sh (предназначен в основном для сред Linux/macOS), который пытается запустить Redis (если он не запущен) и воркер в фоновом режиме:

    # Ensure the script is executable: chmod +x ./scripts/start-services.sh
    ./scripts/start-services.sh
    # Then start the MCP server manually as shown above.

API MCP

Сервер предоставляет следующие конечные точки, совместимые с MCP:

Инструменты

  • generate_text

    • Описание: Отправляет запрос на генерацию текста в API OpenRouter через фоновую очередь.

    • Входные данные: {"prompt": "Ваш текстовый промпт здесь"} (Тип: GenerateTextRequest)

    • Выходные данные: {"job_id": "rq:job:..."} (Уникальный ID для задания в очереди)

Ресурсы

  • job://{job_id}

    • Описание: Получает статус и результат ранее отправленного задания.

    • Параметр URI: job_id (ID, возвращенный инструментом generate_text).

    • Выходные данные: {"status": "...", "result": "..."} (Тип: JobStatusResponse)

      • status: Текущее состояние задания (например, "queued", "started", "finished", "failed"). RQ внутренне использует немного другие термины ("started" против "processing", "finished" против "completed"). Ресурс выполняет их сопоставление.

      • result: Сгенерированный текст, если статус задания "completed", в противном случае null. Если задание завершилось ошибкой, результат может быть null или содержать информацию об ошибке в зависимости от обработки RQ.

Тестирование

Проект включает тесты. Убедитесь, что вы установили тестовые зависимости (pip install -e .[test] или uv pip install -e .[test]).

Запустите тесты с помощью pytest:

pytest tests

Примечание: Тесты могут потребовать имитации Redis (fakeredis) и, возможно, вызовов API OpenRouter в зависимости от их реализации.

Устранение неполадок

  • Ошибка: OpenRouter API key not available: Убедитесь, что OPENROUTER_API_KEY задан или файл ~/.api-openrouter существует и содержит ваш ключ в одну строку (без пробелов).

  • Задания застревают в "queued": Проверьте, что воркер RQ (python -m mcp_waifu_queue.worker) запущен в отдельном терминале и подключен к тому же экземпляру Redis, который указан в .env. Проверьте логи воркера на наличие ошибок.

  • ConnectionRefusedError (Redis): Убедитесь, что ваш сервер Redis запущен и доступен по адресу REDIS_URL, указанному в .env.

  • Проблемы с подключением к серверу MCP: Убедитесь, что сервер MCP (uvicorn ...) запущен и вы подключаетесь к правильному хосту/порту.

Участие в разработке

  1. Сделайте форк репозитория.

  2. Создайте новую ветку для вашей функции или исправления ошибки (git checkout -b feature/your-feature-name).

  3. Внесите изменения и закоммитьте их (git commit -am 'Add some feature').

  4. Отправьте ветку в ваш форкнутый репозиторий (git push origin feature/your-feature-name).

  5. Создайте Pull Request в оригинальный репозиторий.

Пожалуйста, придерживайтесь стандартов кодирования и правил линтинга проекта (ruff).

Лицензия

Этот проект лицензирован по лицензии MIT-0 — подробности см. в файле LICENSE.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/waifuai/mcp-waifu-queue'

If you have feedback or need assistance with the MCP directory API, please join our Discord server