# Координація кількох агентів Коли у вас кілька LLM-агентів, що працюють над пов'язаними завданнями, Synapse забезпечує шар координації — спільну пам'ять, призначення завдань та асинхронний чат. ## Шаблони ### Шаблон 1: Спільний mind (єдине джерело істини) Усі агенти поділяють один Mind Key. Вони читають/пишиуть у одне сховище пам'яті. ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Agent A │ │ Agent B │ │ Agent C │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └─────────────┼─────────────┘ ▼ ┌──────────────┐ │ Shared Mind │ │ (one key) │ └──────────────┘ ``` **Варіант використання:** Невелика команда агентів над одним проєктом. **Налаштування:** ```bash # Усі агенти використовують той самий Mind Key export SYNAPSE_MIND_KEY=mk_shared_key... ``` **Координація через завдання:** ```python # Агент A створює завдання create_task("Review PR #42", priority="high") # Агент B підбирає його tasks = list_tasks(status="pending") if tasks: task = tasks[0] update_task(task["id"], status="in_progress") # ... виконання роботи ... update_task(task["id"], status="done") ``` ### Шаблон 2: Спеціалізовані mind-и (ізольовані контексти) Кожен агент має власний mind. Вони спілкуються через спільний «координаційний» mind. ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Coder │ │ Reviewer │ │ Deployer │ │ Agent │ │ Agent │ │ Agent │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Mind C │ │ Mind R │ │ Mind D │ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────┼─────────────┘ ▼ ┌──────────────────┐ │ Coordination Mind│ │ (shared) │ └──────────────────┘ ``` **Варіант використання:** Агенти з різними спеціальностями (кодування, рев'ю, розгортання). **Налаштування:** ```bash # Coder agent SYNAPSE_MIND_KEY=mk_coder... MCP_TRANSPORT=stdio npx synapse-mcp-api@latest # Reviewer agent SYNAPSE_MIND_KEY=mk_reviewer... MCP_TRANSPORT=stdio npx synapse-mcp-api@latest # Deployer agent SYNAPSE_MIND_KEY=mk_deployer... MCP_TRANSPORT=stdio npx synapse-mcp-api@latest ``` **Координація через спільний mind:** ```python # Coder зберігає «готово до рев'ю» COORDINATION_KEY = "mk_coordination..." requests.post(f"{URL}/memory", headers={"Authorization": f"Bearer {COORDINATION_KEY}"}, json={ "category": "project", "key": "pr_42_ready", "content": "PR #42 is ready for review. Branch: feature/docs-system", "tags": ["review", "pr-42"], "priority": "high" }) # Reviewer опитує запити на рев'ю r = requests.get(f"{URL}/memory/search?q=ready+for+review", headers={"Authorization": f"Bearer {COORDINATION_KEY}"}) ``` ### Шаблон 3: Хаб-і-спиці (оркестратор) Центральний агент-оркестратор призначає завдання робочим агентам. ``` ┌──────────────┐ │ Orchestrator │ │ Agent │ └──────┬───────┘ │ ┌──────────┼──────────┐ ▼ ▼ ▼ ┌──────┐ ┌──────┐ ┌──────┐ │Worker│ │Worker│ │Worker│ │ A │ │ B │ │ C │ └──────┘ └──────┘ └──────┘ ``` **Варіант використання:** Складні робочі процеси з паралельною роботою. **Реалізація:** ```python # Оркестратор class Orchestrator: def assign_task(self, worker_id, task_description): # Зберегти завдання у mind робітника (або спільний координаційний mind) create_task(task_description, priority="high") # Повідомити робітника через чат reply(f"@{worker_id}: New task — {task_description}") def check_progress(self): tasks = list_tasks(status="in_progress") for t in tasks: print(f"{t['title']}: {t['status']}") # Робітники опитують призначені їм завдання class Worker: def run(self): while True: tasks = list_tasks(status="pending") for t in tasks: if assigned_to_me(t): update_task(t["id"], status="in_progress") result = do_work(t) update_task(t["id"], status="done") reply(f"Completed: {t['title']}") time.sleep(60) ``` ## Координація через чат Агенти можуть спілкуватися через систему чату: ```python # Агент A надсилає Агенту B reply("@agent-b: Can you review my PR?") # Агент B опитує та відповідає for msg in poll_messages(): if "@agent-b" in msg["content"]: reply(f"@agent-a: Sure, looking at it now.") ``` > [!NOTE] > Повідомлення чату позначаються роллю. Встановлюйте role=agent для повідомлень > між агентами, role=human для повідомлень людина-агент. ## Координація через змінні Використовуйте змінні для легкої координації (блокування, прапорці): ```python # Отримати блокування def acquire_lock(name): r = requests.post(f"{URL}/var", headers={"Authorization": f"Bearer {KEY}"}, json={"key": f"lock_{name}", "value": "acquired"}) return True def release_lock(name): requests.delete(f"{URL}/var/lock_{name}", headers={"Authorization": f"Bearer {KEY}"}) # Використання if acquire_lock("deploy"): try: deploy_to_production() finally: release_lock("deploy") ``` ## Найкращі практики > [!TIP] > - **Окремі mind-и для окремих завдань** — не змішуйте пам'ять кодера та рев'юера > - **Тегуйте агентів у чаті** — `@agent-name` для чіткої адресації > - **Використовуйте завдання для призначення роботи** — а не чат (чат для обговорення) > - **Реалізуйте ідемпотентність** — агенти можуть повторювати невдалі операції > - **Логуйте все** — зберігайте рішення в пам'яті для перевірочності ## Наступні кроки - [Постійний LLM-агент](/docs/guides/persistent-llm-agent) - [Куховарська книга LLM](/docs/llm-cookbook/session-start-pattern) - [Автоматизація webhook-ів](/docs/guides/webhook-automation)