Files
ChatBot/README.md
Leonid Pershin d9151105e8
Some checks failed
SonarQube / Build and analyze (pull_request) Failing after 2m56s
add gate
2025-10-22 03:42:41 +03:00

12 KiB
Raw Blame History

🤖 ChatBot - AI Telegram Bot

.NET License PostgreSQL

Quality Gate Status Coverage Bugs Vulnerabilities Code Smells

Интеллектуальный Telegram-бот на базе локальных AI моделей (Ollama), построенный на .NET 9 с использованием Clean Architecture.

Основные возможности

  • 🤖 AI-интеграция - Использование локальных LLM через Ollama (gemma2, llama3, mistral)
  • 💬 Telegram Bot - Полнофункциональный бот с поддержкой команд и групповых чатов
  • 💾 PostgreSQL - Надежное хранение истории диалогов и сессий
  • 🗜️ История сжатия - Автоматическая оптимизация длинных диалогов
  • 🔄 Retry механизмы - Устойчивость к сбоям с экспоненциальным backoff
  • 📊 Health Checks - Мониторинг состояния всех сервисов
  • 🧪 Высокое покрытие тестами - 50+ тестовых классов
  • 📝 Serilog - Структурированное логирование

🚀 Быстрый старт

Требования

Установка за 3 шага

1. Клонирование и установка зависимостей

git clone https://github.com/mrleo1nid/ChatBot.git
cd ChatBot
dotnet restore

2. Настройка окружения

Создайте файл ChatBot/.env:

# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=chatbot
DB_USER=postgres
DB_PASSWORD=your_secure_password

# Telegram Bot Configuration
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here

# Ollama Configuration
OLLAMA_URL=http://localhost:11434
OLLAMA_DEFAULT_MODEL=gemma2:2b

3. Запуск

# Установите AI модель
ollama pull gemma2:2b

# Создайте базу данных
psql -U postgres -c "CREATE DATABASE chatbot;"

# Запустите бота
cd ChatBot
dotnet run

🎉 Готово! Откройте Telegram и найдите вашего бота.

📚 Документация

🎯 Начало работы

🏗️ Архитектура

💻 Разработка

📖 Полная документация

👉 Перейти к полной документации

🎮 Использование

Команды бота

/start    - Начать работу с ботом
/help     - Показать справку
/clear    - Очистить историю диалога
/settings - Показать текущие настройки
/status   - Проверить статус бота

Пример диалога

Вы: Привет!
Бот: Привет! Как дела? 😊

Вы: Расскажи анекдот
Бот: Программист ложится спать...
     Ставит рядом два стакана:
     один с водой — если захочет пить,
     другой пустой — если не захочет 😄

🏗️ Технологический стек

Backend

  • Runtime: .NET 9.0
  • Language: C# 13
  • Architecture: Clean Architecture, SOLID

Основные библиотеки

  • Telegram.Bot 22.7.2 - Telegram Bot API
  • OllamaSharp 5.4.7 - Ollama клиент для AI
  • Entity Framework Core 9.0.10 - ORM
  • Npgsql 9.0.4 - PostgreSQL провайдер
  • Serilog 4.3.0 - Логирование
  • FluentValidation 12.0.0 - Валидация

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

  • xUnit 2.9.3 - Тестовый фреймворк
  • Moq 4.20.72 - Моки и стабы
  • FluentAssertions 8.7.1 - Assertions
  • Coverlet 6.0.4 - Code coverage

📊 Архитектура

┌─────────────────────────────────────┐
│   Telegram Bot Layer               │
│   (Commands, Handlers)              │
├─────────────────────────────────────┤
│   Service Layer                     │
│   (ChatService, AIService)          │
├─────────────────────────────────────┤
│   Data Access Layer                 │
│   (Repositories, DbContext)         │
├─────────────────────────────────────┤
│   Infrastructure                    │
│   (PostgreSQL, Ollama, Telegram)    │
└─────────────────────────────────────┘

Принципы:

  • Clean Architecture
  • SOLID принципы
  • Dependency Injection
  • Repository Pattern
  • Command Pattern для команд бота

🐳 Docker развертывание

# Сборка образа
docker build -t chatbot:latest .

# Запуск с docker-compose
docker-compose up -d

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

# Запуск всех тестов
dotnet test

# С покрытием кода
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover

# Запуск конкретного теста
dotnet test --filter "FullyQualifiedName~ChatServiceTests"

📈 CI/CD

Проект использует Gitea Actions для автоматизации:

  • Сборка проекта
  • Запуск тестов
  • Анализ кода (SonarQube)
  • Проверка покрытия

Конфигурация: .gitea/workflows/build.yml

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

Основные параметры

Параметр Описание По умолчанию
AI.Temperature Креативность ответов (0.0-2.0) 0.9
AI.MaxRetryAttempts Макс. попыток повтора 3
AI.EnableHistoryCompression Сжатие истории true
AI.CompressionThreshold Порог сжатия (сообщений) 20

Подробнее: docs/configuration.md

🛠️ Разработка

Структура проекта

ChatBot/
├── ChatBot/              # Основной проект
│   ├── Services/         # Бизнес-логика
│   ├── Data/            # Доступ к данным
│   ├── Models/          # Модели и конфигурация
│   └── Program.cs       # Точка входа
├── ChatBot.Tests/       # Тесты
└── docs/                # Документация

Добавление новой команды

public class MyCommand : TelegramCommandBase
{
    public override string Command => "mycommand";
    public override string Description => "Описание команды";
    
    public override async Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context)
    {
        return new ReplyInfo { Text = "Ответ" };
    }
}

Зарегистрируйте в Program.cs:

builder.Services.AddScoped<ITelegramCommand, MyCommand>();

🤝 Вклад в проект

Мы приветствуем вклад в развитие проекта!

Как внести изменения

  1. Fork репозитория
  2. Создайте feature branch (git checkout -b feature/amazing-feature)
  3. Commit изменения (git commit -m 'Add amazing feature')
  4. Push в branch (git push origin feature/amazing-feature)
  5. Откройте Pull Request

Guidelines

  • Следуйте существующему стилю кода
  • Добавляйте тесты для новой функциональности
  • Обновляйте документацию
  • Убедитесь, что все тесты проходят

📝 Лицензия

Этот проект распространяется под лицензией MIT. См. LICENSE.txt для подробностей.

🙏 Благодарности

  • Telegram Bot API - За отличное API
  • Ollama - За возможность использовать локальные LLM
  • .NET Community - За мощный фреймворк

📞 Контакты и поддержка

🌟 Roadmap

  • Поддержка мультимодальных моделей (изображения)
  • Веб-интерфейс для управления ботом
  • Метрики и аналитика использования
  • Kubernetes deployment манифесты
  • Дополнительные команды (история, экспорт)
  • Плагинная система для расширений

Сделано с ❤️ используя .NET 9 и Ollama