Разработка AI-ассистента для системы управления проектами

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-ассистента для системы управления проектами
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Разработка AI-ассистента для системы управления проектами

AI-ассистент для PM-системы (Jira, Linear, Asana) автоматизирует рутину: декомпозиция задач, составление sprint-отчётов, выявление рисков, предложения по приоритизации. Менеджер тратит меньше времени на административную работу и больше — на реальное управление.

Основные функции ассистента

from anthropic import Anthropic
from typing import Optional
import json
import requests
from pydantic import BaseModel

client = Anthropic()

class Task(BaseModel):
    title: str
    description: str
    story_points: int
    priority: str
    acceptance_criteria: list[str]
    labels: list[str] = []

class SprintReport(BaseModel):
    completed_points: int
    total_points: int
    velocity: float
    blockers: list[str]
    risks: list[str]
    team_highlights: list[str]
    next_sprint_recommendations: list[str]

class PMAssistant:

    def decompose_feature(self, feature_description: str, team_context: str = "") -> list[Task]:
        """Декомпозирует фичу на задачи"""

        response = client.messages.create(
            model="claude-sonnet-4-5",
            max_tokens=4096,
            messages=[{
                "role": "user",
                "content": f"""Декомпозируй фичу на задачи для разработки.

Фича: {feature_description}
{f"Контекст команды: {team_context}" if team_context else ""}

Верни JSON:
[{{
  "title": "название задачи",
  "description": "описание",
  "story_points": 1|2|3|5|8|13,
  "priority": "critical|high|medium|low",
  "acceptance_criteria": ["критерий 1", ...],
  "labels": ["frontend", "backend", "database", ...]
}}]

Разбей на задачи размером 1–3 дня каждая. Включи: design, backend, frontend, tests, deployment."""
            }]
        )

        text = response.content[0].text
        data = json.loads(text[text.find("["):text.rfind("]") + 1])
        return [Task(**t) for t in data]

    def generate_sprint_report(self, sprint_data: dict) -> SprintReport:
        """Генерирует sprint report"""

        response = client.messages.create(
            model="claude-haiku-4-5",
            max_tokens=2048,
            messages=[{
                "role": "user",
                "content": f"""Составь sprint report.

Данные спринта:
{json.dumps(sprint_data, ensure_ascii=False, indent=2)}

Верни JSON:
{{
  "completed_points": число,
  "total_points": число,
  "velocity": число,
  "blockers": ["блокеры"],
  "risks": ["риски на следующий спринт"],
  "team_highlights": ["достижения команды"],
  "next_sprint_recommendations": ["рекомендации"]
}}"""
            }]
        )

        text = response.content[0].text
        data = json.loads(text[text.find("{"):text.rfind("}") + 1])
        return SprintReport(**data)

    def analyze_backlog_health(self, backlog_items: list[dict]) -> dict:
        """Анализирует здоровье бэклога"""

        response = client.messages.create(
            model="claude-sonnet-4-5",
            max_tokens=2048,
            messages=[{
                "role": "user",
                "content": f"""Проанализируй бэклог и дай рекомендации.

Бэклог ({len(backlog_items)} задач):
{json.dumps(backlog_items[:20], ensure_ascii=False)}

Оцени:
1. Приоритизацию (логична ли?)
2. Размер задач (нет ли слишком крупных?)
3. Зависимости (есть ли блокеры?)
4. Технический долг vs новый функционал
5. Quick wins которые стоит сделать первыми"""
            }]
        )

        return {"analysis": response.content[0].text}

    def write_user_story(self, feature_request: str, persona: str = "пользователь") -> str:
        """Пишет User Story в правильном формате"""

        response = client.messages.create(
            model="claude-haiku-4-5",
            max_tokens=1024,
            messages=[{
                "role": "user",
                "content": f"""Напиши User Story в формате "Как [роль], я хочу [действие], чтобы [ценность]".

Запрос: {feature_request}
Персона: {persona}

Включи:
- User Story в правильном формате
- Acceptance Criteria (5-7 пунктов по GIVEN/WHEN/THEN)
- Story Points (1-13) с обоснованием
- Definition of Done"""
            }]
        )

        return response.content[0].text

Jira интеграция

from jira import JIRA

class JiraAssistant:

    def __init__(self, server: str, email: str, api_token: str):
        self.jira = JIRA(server=server, basic_auth=(email, api_token))

    def create_tasks_from_feature(
        self,
        project_key: str,
        sprint_id: int,
        feature_description: str,
    ) -> list[str]:
        """Создаёт задачи в Jira из описания фичи"""
        assistant = PMAssistant()
        tasks = assistant.decompose_feature(feature_description)

        created_issues = []
        for task in tasks:
            issue = self.jira.create_issue({
                "project": {"key": project_key},
                "summary": task.title,
                "description": task.description + "\n\nAC:\n" + "\n".join(
                    f"- {ac}" for ac in task.acceptance_criteria
                ),
                "issuetype": {"name": "Story"},
                "story_points": task.story_points,
                "priority": {"name": task.priority.capitalize()},
                "labels": task.labels,
            })
            created_issues.append(issue.key)

            # Добавляем в спринт
            self.jira.add_issues_to_sprint(sprint_id, [issue.key])

        return created_issues

    def get_sprint_data(self, board_id: int) -> dict:
        """Получает данные текущего спринта"""
        sprints = self.jira.sprints(board_id, state="active")
        if not sprints:
            return {}

        sprint = sprints[0]
        issues = self.jira.search_issues(
            f"sprint = {sprint.id}",
            maxResults=100,
            fields="summary,status,story_points,assignee,labels"
        )

        return {
            "sprint_name": sprint.name,
            "start_date": str(sprint.startDate),
            "end_date": str(sprint.endDate),
            "issues": [{
                "key": i.key,
                "summary": i.fields.summary,
                "status": i.fields.status.name,
                "story_points": getattr(i.fields, "story_points", 0),
                "assignee": i.fields.assignee.displayName if i.fields.assignee else None,
            } for i in issues]
        }

Практический кейс: продуктовая команда 12 человек

Задачи автоматизированы:

  • Декомпозиция эпиков → задачи Jira (10 мин → 2 мин)
  • Sprint report в Confluence (45 мин → 5 мин)
  • Standup summary из Jira данных
  • Риск-анализ бэклога перед планированием

Результаты:

  • Время PM на административные задачи: -38%
  • Качество User Stories (оценка команды): 3.1/5 → 4.2/5
  • Sprint completion rate: 71% → 84%

Сроки

  • Базовый ассистент (декомпозиция + отчёты): 1 неделя
  • Jira/Linear интеграция: 1 неделя
  • Авто-создание задач + sprint planning: 1 неделя
  • Standup bot + weekly digest: +3–5 дней