多代理系统集成工具

一个生产就绪的多代理系统,集成了新闻分析管道和A2A文件系统代理,支持多种MCP服务器工具,适用于自动化数据分析和文件管理任务。

  • by agentspro
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 agentspro/module4

使用说明

Module 4: Multi-Agent Systems з MCP та A2A

Production-ready multi-agent система що демонструє дві ключові інтеграції:

  1. News Analysis Pipeline — 5 агентів CrewAI + MCP Sequential Thinking
  2. A2A Filesystem Agent — Agent-to-Agent сервер з MCP Filesystem інструментами

Архітектура

Pipeline 1: News Analysis (5 агентів + MCP)

┌─────────────────┐
│ BBC Researcher  │─┐  DuckDuckGo
└─────────────────┘ │  Search
                    ├──► ┌──────────────────┐       ┌─────────────────┐
┌─────────────────┐ │    │ Senior Analyst   │       │ MCP Sequential  │
│ CNN Researcher  │─┤    │ (з MCP tools)    │◄──────┤ Thinking Server │
└─────────────────┘ │    └──────────────────┘       └─────────────────┘
                    │                ▼                (npx server)
┌─────────────────┐ │    ┌──────────────────┐
│Reuters Researcher│─┘    │ Report Synthesizer│
└─────────────────┘       └──────────────────┘

Pipeline 2: A2A Filesystem Agent

┌────────────────┐  HTTP/JSON-RPC  ┌──────────────────┐
│ A2A Client     │◄═══════════════►│ A2A Server       │
│ (a2a_test_     │                 │ (port 10002)     │
│  client.py)    │                 └────────┬─────────┘
└────────────────┘                          │
                                   ┌────────▼─────────┐
                                   │ AgentExecutor     │
                                   │ (CrewAI + LLM)    │
                                   └────────┬─────────┘
                                            │ stdio
                                   ┌────────▼─────────┐
                                   │ MCP Filesystem    │
                                   │ Server (14 tools) │
                                   └──────────────────┘

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

module4/
├── config.py                     # Конфігурація (env vars, валідація)
├── parallel_agent_with_mcp.py    # Pipeline 1: News Analysis (5 агентів + MCP Thinking)
├── mcp_examples.py               # Інтерактивні приклади 5 MCP серверів
│
├── a2a_server.py                 # Pipeline 2: A2A Filesystem Agent (HTTP сервер)
├── a2a_agent_executor.py         # AgentExecutor: міст A2A <-> CrewAI + MCP Filesystem
├── a2a_test_client.py            # Тестовий A2A клієнт
│
├── requirements.txt              # Python залежності
├── .env.example                  # Шаблон конфігурації
└── a2a/a2a-samples/              # Git submodule: приклади A2A (reference)

Встановлення

Крок 1: Node.js (для MCP серверів)

node --version  # v18+ рекомендовано
npx --version

Якщо немає Node.js: https://nodejs.org/

Крок 2: Python virtual environment

Важливо: потрібен Python >=3.10, <3.14 (CrewAI не підтримує 3.14).

# Створити venv (якщо Python 3.14 — використайте conda або pyenv для 3.13)
python3 -m venv .venv
source .venv/bin/activate

# Встановити залежності
pip install -r requirements.txt

Крок 3: Конфігурація

cp .env.example .env

Відредагуйте .env:

# Обов'язково
OPENAI_API_KEY=your-openai-api-key-here
# Пошук: DuckDuckGo (API ключ не потрібен)

# Опціонально
DEFAULT_MODEL=gpt-4o-mini
TEMPERATURE=0.7
ENABLE_MCP_THINKING=true
MAX_SEARCH_RESULTS=3

Використання

Pipeline 1: News Analysis

python parallel_agent_with_mcp.py

5 агентів: 3 researcher-и шукають новини через DuckDuckGo, аналітик робить 5-кроковий аналіз через MCP Sequential Thinking (+ може дошукати факти через DuckDuckGo), синтезатор створює фінальний звіт.

Програмне використання:

from parallel_agent_with_mcp import run_advanced_analysis

result = run_advanced_analysis(topic="quantum computing breakthrough")
print(result['result'])
print(f"Duration: {result['duration']:.2f}s")

Pipeline 2: A2A Filesystem Agent

Термінал 1 — запуск сервера:

python a2a_server.py --allowed-dir /tmp
# або кілька директорій:
python a2a_server.py --allowed-dir /tmp --allowed-dir /home/user/docs --port 10002

Термінал 2 — перевірка AgentCard:

curl http://localhost:10002/.well-known/agent-card.json | python -m json.tool

Термінал 2 — відправка запиту:

python a2a_test_client.py --query "List all files in /tmp"
python a2a_test_client.py --query "Read the contents of /tmp/myfile.txt"
python a2a_test_client.py --query "Create a directory called /tmp/reports"

MCP Examples (інтерактивний)

python mcp_examples.py

Оберіть приклад: Sequential Thinking, Filesystem, Fetch, Git, або Memory.

Як працює MCP інтеграція

MCPServerAdapter — підключення до MCP сервера

from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters

server_params = StdioServerParameters(
    command="npx",
    args=["-y", "@modelcontextprotocol/server-sequential-thinking"]
)

with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
    # mcp_tools — list[CrewAI Tool], автоматично конвертовані з MCP
    agent = Agent(tools=mcp_tools, ...)
    crew = Crew(agents=[agent], tasks=[...])
    crew.kickoff()
# MCP сервер зупиняється при виході з with

Важливо: вся робота з агентами має бути всередині with блоку.

Комбінація звичайних tools + MCP tools

Аналітик отримує обидва типи інструментів в одному списку:

combined_tools = [search_news] + list(mcp_tools)
agent = Agent(tools=combined_tools, ...)

Sanitization MCP схем для OpenAI

MCP інструменти генерують JSON Schema з проблемами (null enum, missing types, additionalProperties: true). _sanitize_mcp_tools() в a2a_agent_executor.py перебудовує схеми через чисті Pydantic-моделі:

  • Top-level модель: extra="ignore" — CrewAI передає додаткові kwargs
  • Nested моделі: extra="forbid" — OpenAI вимагає additionalProperties: false

Як працює A2A інтеграція

AgentCard — візитка агента

skill = AgentSkill(
    id='filesystem_assistant',
    name='Filesystem Assistant',
    description='Manages files using natural language',
    examples=['List all .py files in /tmp'],
)
agent_card = AgentCard(name='Filesystem Agent', skills=[skill], ...)

Доступна за /.well-known/agent-card.json. Клієнти дізнаються можливості агента.

AgentExecutor — обробка запитів

class FilesystemAgentExecutor(AgentExecutor):
    async def execute(self, context, event_queue):
        query = context.get_user_input()
        result = await asyncio.to_thread(self._run_crew, query)  # async <-> sync bridge
        await event_queue.enqueue_event(new_agent_text_message(result))

asyncio.to_thread() — міст між async A2A сервером і sync CrewAI.

Офіційні MCP сервери

Сервер Пакет Опис
Sequential Thinking (*) @modelcontextprotocol/server-sequential-thinking Покрокове мислення
Filesystem (*) @modelcontextprotocol/server-filesystem /path Робота з файлами (14 інструментів)
Fetch @modelcontextprotocol/server-fetch Завантаження веб-контенту
Git @modelcontextprotocol/server-git --repository /path Аналіз Git репозиторіїв
Memory @modelcontextprotocol/server-memory Knowledge graph пам'ять

(*) — використовуються в цьому проекті

Як додати інший MCP сервер

server_params = StdioServerParameters(
    command="npx",
    args=["-y", "@modelcontextprotocol/server-НАЗВА"]
)

with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
    agent = Agent(role='Your Role', tools=mcp_tools, ...)

Повний список: Офіційні MCP сервери | Від спільноти

Залежності

Пакет Версія Призначення
crewai >=0.80.0 Multi-agent framework
crewai-tools[mcp] >=1.3.0 MCP адаптер для CrewAI
mcp >=1.6.0 Model Context Protocol
ddgs >=9.0.0 DuckDuckGo Search (без API ключа)
a2a-sdk >=0.3.0 Agent-to-Agent Protocol SDK
uvicorn >=0.30.0 ASGI HTTP сервер
click >=8.0.0 CLI інтерфейс
httpx >=0.27.0 Async HTTP клієнт
langchain >=1.0.0 LLM orchestration
langchain-openai >=1.0.0 OpenAI integration
python-dotenv >=1.0.0 Environment variables

Troubleshooting

"No matching distribution found for crewai"

Проблема: Python 3.14+ (CrewAI підтримує тільки <3.14)

Рішення:

conda create -n myenv python=3.13
conda activate myenv
pip install -r requirements.txt

"OpenAI API key not found"

OPENAI_API_KEY=your-api-key-here   # в .env
export OPENAI_API_KEY="your-key"   # або через export

"command not found: npx"

brew install node   # macOS
# або https://nodejs.org/

"unexpected extra inputs" в A2A agent

Проблема: extra="forbid" на top-level Pydantic моделі відхиляє kwargs від CrewAI

Рішення: top-level модель повинна мати extra="ignore", nested — extra="forbid". Вже виправлено в a2a_agent_executor.py.

Timeout при підключенні до MCP

with MCPServerAdapter(server_params, connect_timeout=120) as mcp_tools:

Корисні посилання

License

MIT License