Оркестратор локальных AI-моделей с богатым REST API
ai_assist — универсальный оркестратор для локальных AI-моделей.
Единая точка доступа к Microsoft Foundry Local, HuggingFace Transformers, llama.cpp и Ollama
через стандартизированный REST API с интегрированной RAG-системой, веб-интерфейсом и MCP-серверами.
Если вы ничего не знаете о проекте, начинайте отсюда:
| Что нужно понять | Где смотреть |
|---|---|
| Как запустить проект | start.ps1, раздел Быстрый старт |
| Что открывать в браузере | http://localhost:9696 |
| Где FastAPI приложение | src/api/app.py, src/api/endpoints/ |
| Где веб-интерфейс | static/interface/index.html, static/interface/app.js, static/interface/partials/ |
| Где переводы интерфейса | static/interface/locales/ru.json, en.json, he.json |
| Где документация | docs/ru/ и mkdocs.yml |
| Где конфигурация | config.json, .env |
| Где тесты | tests/, check_engine/ |
Текущий главный сценарий: Windows + PowerShell + локальный FastAPI сервер. Docker поддерживается, но операционные скрипты проекта сейчас в основном ориентированы на Windows.
Документация в проекте есть, но она пока не является полностью завершенной “единой системой знаний”.
Сейчас уже есть:
README.mdкак входная точка для проекта.docs/ru/как основная MkDocs-документация.docs/en/как начатая английская ветка.docs/ru/dev/code/с автогенерируемыми/полуавтогенерируемыми описаниями кода.static/interface/locales/*.jsonдля переводов веб-интерфейса через i18n.
Что важно: i18n веб-интерфейса и мультиязычная документация — это разные слои. Сейчас интерфейс уже переводится через JSON-словари, а документация собирается MkDocs из docs/ru. Следующий крупный шаг — привести документацию к той же дисциплине мультиязычности, но отдельным pipeline.
Веб-интерфейс уже построен вокруг i18n:
- HTML partials используют
data-i18n,data-i18n-placeholder,data-i18n-title. - Переводы лежат в
static/interface/locales/. - Язык выбирается в UI и сохраняется в конфигурацию.
- RTL-направление включается для языков вроде иврита.
Правило для интерфейса: не писать пользовательские строки прямо в JS/HTML, если они видны пользователю. Новые строки должны получать ключ в локалях ru, en, he.
Для документации целевая схема другая:
- Markdown-документы должны жить по языковым деревьям:
docs/ru,docs/en, далееdocs/heи другие языки. - Русский сейчас считается основным источником правды.
- Переводы документации должны генерироваться и обновляться автоматизированно, но проходить ручную проверку для важных страниц.
- Навигация MkDocs должна поддерживать языковые версии без копипасты всей конфигурации.
Рекомендуемый следующий инструмент для этого проекта: mkdocs-static-i18n поверх текущего mkdocs-material. Он хорошо ложится на существующий MkDocs, позволяет держать несколько языков рядом и не ломает текущую структуру. Для генерации черновиков переводов можно добавить отдельный скрипт, который берет Markdown из базового языка, переводит только текст, сохраняет кодовые блоки/ссылки/таблицы и пишет результат в соответствующее языковое дерево.
Пока это не внедрено полностью, любые изменения документации нужно делать минимум в docs/ru/ и отмечать, какие страницы требуют перевода.
Для материалов, которые должны быть понятны пользователю “с первой страницы”, MkDocs не всегда лучший носитель. В проекте появился отдельный контур для поддерживаемых контентных блоков:
- источник данных хранится в репозитории:
content/blocks/*.json; - локальный FastAPI сервер отдает блок как JSON и как безопасный HTML;
- WordPress показывает этот материал через динамический Gutenberg-блок;
- обновление смысла происходит в JSON под версионным контролем, а WordPress остается редакционным слоем.
Первый блок:
| Блок | Источник | Локальный API | WordPress plugin |
|---|---|---|---|
dimitrieva |
content/blocks/dimitrieva.json |
/api/v1/content/blocks/dimitrieva |
wordpress/fastapi-foundry-blocks |
HTML-версия для WordPress:
http://localhost:9696/api/v1/content/blocks/dimitrieva/html
Важно: localhost для WordPress означает машину, где запущен WordPress. Если WordPress и FastAPI Foundry работают на разных машинах, в настройках блока нужно указать доступный URL FastAPI сервера.
- 🎛️ Оркестрация моделей — единый API для Foundry, HuggingFace, llama.cpp, Ollama
- 🤖 Генерация текста через локальные AI модели (DeepSeek, Qwen, Mistral, Llama, Gemma)
- 💬 Интерактивный чат с поддержкой истории сессии и потоковой передачи (SSE)
- ⚙️ Управление Foundry — запуск, остановка и мониторинг через веб-интерфейс
- 🤗 HuggingFace — работа с моделями и inference Hub
- 🦙 llama.cpp — запуск GGUF моделей на CPU/GPU
- 🐋 Ollama — интеграция с локальным Ollama-сервисом
- 🔍 RAG система — векторный поиск по документации (FAISS + SentenceTransformers)
- 📄 Извлечение текста из 40+ форматов (PDF, DOCX, XLSX, изображения OCR, HTML, архивы)
- 📦 Пакетная обработка множественных запросов
- 🔐 Безопасность через API ключи и CORS защиту
- 📊 Мониторинг здоровья сервиса и моделей
- 🐳 Docker поддержка
- 🌐 Веб-интерфейс (SPA) для управления всеми компонентами
- 🔌 MCP серверы для STDIO (PowerShell), HTTP и других протоколов
- 🌍 i18n — интерфейс на русском, английском, иврите
Browser / API Client / MCP Client
│ HTTP / SSE / WebSocket
▼
AI Assistant (ai_assist)
FastAPI — port 9696
│
┌──────────┼──────────────┬──────────────┐
▼ ▼ ▼ ▼
Foundry HuggingFace llama.cpp Ollama
Local Transformers (GGUF / CPU) (local)
(ONNX) (PyTorch)
│
┌────┴────┐
▼ ▼
FAISS Text
(RAG) Extractor
(40+ formats)
Оркестратор выбирает бэкенд по префиксу в поле model:
| Префикс | Бэкенд |
|---|---|
foundry::model-id |
Microsoft Foundry Local |
hf::model-id |
HuggingFace Transformers |
llama::path/to/model.gguf |
llama.cpp |
ollama::model-name |
Ollama |
Все бэкенды возвращают одинаковый формат ответа. Без префикса — ошибка (устаревшие bare ID пробрасываются в Foundry с предупреждением).
# Первый запуск — установит зависимости автоматически
powershell -ExecutionPolicy Bypass -File .\start.ps1После запуска интерфейс доступен по адресу: http://localhost:9696
Проект поддерживает автоматизированный цикл сборки и контроля качества:
- Контроль качества (QA): При каждом Pull Request запускается
Invoke-Qa.ps1(линтеры, тесты, аудит безопасности). - Управление версиями: Скрипт
scripts/New-Release.ps1помогает поднять версию и создать Git-тег. - Автоматическая сборка: При пуше тега
v*.*.*GitHub Actions автоматически запускает сборку релизного архива. - Локальная сборка: Скрипт
scripts/Build-Release.ps1позволяет собрать ZIP-архив проекта вручную после прохождения всех проверок.
Подробности в документации: CI/CD и автоматизация
В проекте используются Git Hooks для предотвращения коммита некачественного кода. При запуске Invoke-Qa.ps1 система автоматически предлагает установить хуки, которые будут проверять код перед каждым коммитом.
start.ps1 последовательно:
- Проверяет
venv\→ если нет, запускаетinstall.ps1 - Загружает переменные из
.env - Ищет запущенный Foundry → если не найден, запускает
foundry service start - Опционально запускает MkDocs (
docs_server.enabledвconfig.json) - Опционально запускает llama.cpp (если задан
llama_cpp.model_path) - Запускает
venv\Scripts\python.exe run.py
Подробный workflow: Быстрый старт
venv\Scripts\python.exe run.pydocker-compose upai_assist/ (FastApiFoundry-Docker)
├── src/ # Исходный код Python
│ ├── api/ # FastAPI: app.py, endpoints/
│ ├── models/ # AI клиенты: foundry, hf, llama, ollama
│ ├── rag/ # RAG система (FAISS + text extractor)
│ │ └── text_extractors/ # Экстракторы текста
│ │ ├── text_extractor_4_rag/ # 40+ форматов (PDF, DOCX, OCR...)
│ │ └── markitdown/ # Microsoft MarkItDown (Markdown-ориентированный)
│ ├── agents/ # AI агенты
│ ├── converter/ # GGUF → ONNX конвертер
│ └── utils/ # Утилиты (translator, logging, etc.)
├── static/ # Веб-интерфейс (SPA)
├── docs/ # MkDocs документация
├── extensions/ # Браузерные расширения
├── mcp/ # MCP серверы
│ └── src/servers/ # local_models_mcp.py, huggingface_mcp.py, ftp_mcp.py, McpSTDIOServer.ps1
├── scripts/ # Операционные скрипты
├── scripts/Install/ # Скрипты установки
├── check_engine/ # Диагностика и тесты
├── sdk/ # Python SDK (fastapi_foundry, microsoft_foundry)
├── bin/ # Нативные бинарники (llama.cpp, Windows x64)
├── rag_index/ # FAISS индекс
├── logs/ # Логи
├── start.ps1 # Точка входа (Windows)
├── run.py # Python точка входа
├── install.ps1 # Установщик
├── config.json # Конфигурация
├── .env # Переменные окружения (секреты)
├── docker-compose.yml # Docker
└── requirements.txt # Python зависимости
Наш интеллектуальный помощник — обычный HTTP-сервер с REST API. К нему подключается любая программа, умеющая делать HTTP-запросы:
| Клиент | Как подключается |
|---|---|
| Браузер | Встроенный веб-интерфейс на http://localhost:9696 |
| Python / PowerShell скрипт | requests.post("http://localhost:9696/api/v1/generate", ...) |
| Go / Java / C++ / Rust / любой язык | Стандартный HTTP-клиент — net/http, HttpClient, libcurl |
| Telegram бот | Встроенный HelpDesk бот или свой через API |
| Браузерное расширение | Встроенное расширение-суммарайзер |
| Claude Desktop | Через MCP сервер (STDIO) |
| Любой другой MCP-клиент | Через MCP STDIO или HTTP протокол |
| Docker-контейнер | http://host.docker.internal:9696/api/v1/generate |
Сервер не привязан к языку или платформе клиента — если есть HTTP, есть доступ.
| Компонент | Технология |
|---|---|
| Web framework | FastAPI + Uvicorn |
| AI: Foundry | Microsoft Foundry Local CLI (ONNX) |
| AI: HuggingFace | transformers + huggingface_hub (PyTorch) |
| AI: GGUF | llama.cpp (CPU/GPU) |
| AI: Ollama | Ollama HTTP API |
| RAG | FAISS + sentence-transformers |
| OCR | Tesseract + pytesseract + Pillow |
| pdfplumber + PyPDF2 | |
| Office документы | python-docx + python-pptx + openpyxl |
| HTML/XML | BeautifulSoup4 + lxml |
| Контейнеризация | Docker |
| Язык | Python 3.11+ |
| Файл | Назначение |
|---|---|
config.json |
Публичные настройки (порты, модели, RAG) |
.env |
Секреты (токены, ключи, пути) |
docker-compose.yml |
Docker настройки |
Copy-Item .env.example .env
notepad .envКлючевые переменные:
# Foundry (если не определяется автоматически)
FOUNDRY_BASE_URL=http://localhost:50477/v1
# HuggingFace (для закрытых моделей: Gemma, Llama)
HF_TOKEN=hf_ваш_токен
HF_MODELS_DIR=D:\models
# llama.cpp (опционально)
LLAMA_MODEL_PATH=D:\models\qwen2.5-0.5b-q4_k_m.gguf{
"foundry_ai": {
"auto_load_default": true,
"default_model": "qwen3-0.6b-generic-cpu:4"
}
}pip install huggingface_hub
hf auth login
hf download bartowski/gemma-7b-it-GGUF --include "*Q4_K_M.gguf" --local-dir D:\models| Квантование | Размер | Рекомендация |
|---|---|---|
| Q4_K_M | ~4–5 GB | Лучший баланс — по умолчанию |
| Q5_K_M | ~5–6 GB | Лучше качество при достаточной RAM |
| Q8_0 | ~8–9 GB | Максимальное качество |
venv\Scripts\python.exe check_env.py
venv\Scripts\python.exe diagnose.py
venv\Scripts\python.exe check_engine\smoke_all_endpoints.pyОнлайн документация: https://davidka.net/ai_assist/site/
| Раздел | Описание |
|---|---|
| Быстрый старт | Запуск и startup workflow |
| Установка | install.ps1, зависимости |
| Работа с моделями | Foundry, HuggingFace, llama.cpp, Ollama |
| Веб-интерфейс | Описание всех вкладок |
| Архитектура | Структура кода, паттерны |
| API Reference | Все REST endpoints |
| RAG система | FAISS, индексация, поиск |
| Агенты | Создание AI агентов |
| CI/CD | GitHub Actions, MkDocs |
- Зафиксировать
docs/ruкак canonical source. - Подключить
mkdocs-static-i18nи описать языки вmkdocs.yml. - Создать языковые деревья
docs/enиdocs/heс той же структурой URL. - Добавить скрипт генерации черновиков переводов Markdown.
- Добавить проверку CI: битые ссылки, отсутствующие переводы, валидность MkDocs build.
- Разделить документацию по аудиториям: пользователю, администратору, разработчику, тестеру (QA).
- Синхронизировать документацию с новой верхней роль-ориентированной навигацией веб-интерфейса.
- Swagger UI: http://localhost:9696/docs
- Health Check: http://localhost:9696/api/v1/health
- GitHub: https://github.com/hypo69/FastApiFoundry-Docker
MIT License — https://opensource.org/licenses/MIT
Наш интеллектуальный помощник (ai_assist) v0.8.0 | Python 3.11+ | Windows