Neuron — PHP-фреймворк для создания AI-агентов

· 4 мин чтения
php ai-agents framework rag mcp
📂 Исходный код на GitHub

PHP-фреймворк для создания и оркестрации AI-агентов. Объединяет работу с LLM, инструменты, наборы инструментов, MCP-коннектор, структурированный вывод, RAG, Workflow с человеком в контуре и наблюдение через Inspector. В пакете идут 13 скиллов для ИИ-агентов. Требует PHP 8.1+, лицензия MIT.

Neuron — PHP-фреймворк для создания AI-агентов

Neuron — это PHP-фреймворк для создания AI-агентов и управления ими. Он задаёт архитектуру приложения: вы подключаете к агенту LLM, инструменты, векторную базу и память, а агент сам взаимодействует с вашими данными и интерфейсом. Лицензия — MIT, требование к языку — PHP 8.1 или новее. На момент публикации у репозитория около 2100 звёзд, последняя версия — 4.0.3, рабочая ветка — 4.x.

Проект не задуман как библиотека под одну узкую задачу. Разработчики позиционируют Neuron как основу приложения, в котором агент отвечает за логику работы системы. Речь не про чат-надстройку к привычному веб-приложению. Всё, что нужно для такого приложения, собрано в одном месте: работа с LLM, загрузка данных, оркестрация нескольких агентов, наблюдение и отладка.

Почему это нужно именно сейчас

Авторы README дают довольно смелый прогноз: следующее ваше приложение будет агентным. То есть всё большая доля нового софта — это не веб-приложение, в которое потом прикрутили AI-функции. Это приложение, построенное вокруг агента: агент сам выстраивает логику работы системы и общается с пользователем.

Чтобы такое приложение построить, нужны вполне конкретные вещи. Авторы перечисляют их прямо в README:

  • событийные процессы с чекпоинтами, чтобы работу можно было продолжить после сбоя;
  • человек в контуре — точка, где решение принимает живой человек, а не модель;
  • прерывание выполнения;
  • оркестрация нескольких агентов;
  • потоковая выдача ответа;
  • связка агента с интерфейсом через протоколы AG-UI и Vercel AI SDK;
  • коннекторы к MCP-серверам;
  • асинхронное выполнение.

Каждый пункт — отдельная глава официальной документации. Второй довод авторов: когда проект вырастет, второй фреймворк вам не понадобится. Тот же Workflow, который в инструкции для новичков запускает первого агента, спокойно работает в продакшене с системой из нескольких агентов, с состоянием, циклами и согласованиями с человеком. То, что вы разобрали в первый день, вы будете отправлять в продакшен и дальше.

Отдельный довод — найм. Новое приложение на агентах требует людей, которые умеют его проектировать, тестировать и поддерживать. Если архитектура у всех одна и та же, новый разработчик в команде говорит с вами на одном языке.

Установка и первый агент

Установка обычная, через Composer:

composer require neuron-core/neuron-ai

Дальше есть генератор агентов:

vendor/bin/neuron make:agent DataAnalystAgent

Класс агента наследуется от базового Agent. Он уже умеет работать с памятью, инструментами и RAG. Вам остаётся указать провайдера и системную инструкцию:

<?php

namespace App\Neuron;

use NeuronAI\Agent\Agent;
use NeuronAI\Chat\Messages\SystemMessage;
use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;

class DataAnalystAgent extends Agent
{
    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: 'ANTHROPIC_API_KEY',
            model: 'ANTHROPIC_MODEL',
        );
    }

    protected function instructions(): SystemMessage
    {
        return new SystemMessage(
            "You are a data analyst expert in creating reports from SQL databases."
        );
    }
}

Общение выглядит так же, как обычный вызов функции. Привязываете агента к ветке диалога, передаёте сообщение, получаете ответ:

$agent = DataAnalystAgent::make()->setThreadId('user-42');

$response = $agent->chat(
    new UserMessage("Hi, I'm Valerio. Who are you?")
)->getMessage();
echo $response->getContent();
// I'm a data analyst. How can I help you today?

$response = $agent->chat(
    new UserMessage("Do you remember my name?")
)->getMessage();
echo $response->getContent();
// Your name is Valerio, as you said in your introduction.

Обратите внимание на второй ответ. Агент помнит имя из первого сообщения, потому что у него есть память о текущем диалоге. Как она устроена — в разделе про память и историю чата в документации.

Промпт, который отдаётся агенту

В README лежит готовый промпт для установки. Вы копируете его и отдаёте своему агенту по разработке (Claude Code, OpenCode, Cursor). Дальше агент сам разбирается с Composer, ставит пакет, подключает скиллы и проверяет проект по чек-листу.

Смысл промпта в предостережении. Перед тем как писать код на Neuron, агенту велено загрузить нужный скилл из пакета. Причина простая: модель помнит старую версию фреймворка, а API между версиями менялся, поэтому код из памяти может не собраться.

Установка скиллов сводится к одной команде:

npx skills add ./vendor/neuron-core/neuron-ai/skills -y

Скиллы подключаются символическими ссылками, поэтому обновляются вместе с пакетом через Composer. Дальше промпт предлагает определить тип проекта по composer.json и структуре каталогов. Для Laravel активируется навык neuron-laravel-integration, для Symfony — neuron-symfony-integration. Если фреймворка нет, агент начинает с простого агента на чистом PHP.

LLM-провайдеры

Провайдеры вынесены в отдельный компонент. Смена модели — это правка одной строки, и код агента при этом не меняется.

Провайдер Комментарий
Anthropic Используется в примерах README
OpenAI Базовый вариант
OpenAI Responses API Вариант на Responses API
OpenAI on Azure Развёртывание в Azure
OpenAILike Любой API, совместимый с OpenAI
Ollama Локальные модели
Gemini От Google
Gemini Vertex AI Через Vertex AI
Mistral Французский провайдер
HuggingFace Работа моделей на HF
Deepseek Китайский провайдер
Grok От xAI
AWS Bedrock Runtime Через Bedrock
Cohere
ZAI
Alibaba DashScope
Neuron Router Собственный роутер модели: https://github.com/neuron-core/router

Полный список с настройками — в разделе AI-провайдеры.

Инструменты и наборы инструментов

Инструменты — это то, что позволяет агенту не только говорить, но и делать: читать базу, вызывать API, работать с файлами. Их можно писать руками, а можно взять готовые. Набор инструментов (toolkit) — это просто коллекция инструментов под общей обёрткой.

Пример: агент-аналитик получает доступ к MySQL. Код выглядит на удивление коротко:

use NeuronAI\Tools\Toolkits\MySQL\MySQLSchemaTool;
use NeuronAI\Tools\Toolkits\MySQL\MySQLSelectTool;
use NeuronAI\Tools\Toolkits\MySQL\MySQLToolkit;

class DataAnalystAgent extends Agent
{
    protected function tools(): array
    {
        return [
            MySQLToolkit::make(
                \DB::connection()->getPdo()
            )->only([MySQLSchemaTool::class, MySQLSelectTool::class]),
        ];
    }
}

Метод only() оставляет только два инструмента из набора: посмотреть схему и выполнить SELECT. Дальше с агентом можно общаться как с обычным собеседником:

$response = DataAnalystAgent::make()->setThreadId('demo')->chat(
    new UserMessage("How many orders we received today?")
)->getMessage();

echo $response->getContent();

README отдельно предупреждает про безопасность. Инструмент SELECT выполняет каждый запрос в транзакции только для чтения, поэтому база отклонит любую запись. Но прочитать он может всё, что разрешено пользователю подключения. Для продакшена авторы советуют три вещи: отдельное подключение для набора инструментов, пользователя, которому разрешён только SELECT к нужным таблицам, и лимит времени на выполнение запроса.

Подробности — в разделе Tools.

Коннектор к MCP

Если инструменты уже есть у MCP-сервера, писать их руками не нужно. Компонент McpConnector забирает список инструментов у сервера и отдаёт их агенту:

use NeuronAI\MCP\McpConnector;

class DataAnalystAgent extends Agent
{
    protected function tools(): array
    {
        return [
            // Connect to an MCP server
            ...McpConnector::make([
                'command' => 'npx',
                'args' => ['-y', '@modelcontextprotocol/server-everything'],
            ])->tools(),
        ];
    }
}

То есть агент запускает MCP-сервер, спрашивает у него перечень инструментов и подключает их к себе. Дальше всё выглядит так же, как с обычными инструментами. Подробности — в разделе MCP connector.

Структурированный вывод

Часто бывает, что на естественном языке понять ответ нельзя. Его нужно получить в виде данных, чтобы передать дальше в другие системы: автоматизация бизнес-процессов, извлечение данных из текста. Схему ответа вы описываете обычным PHP-классом с атрибутами:

use App\Neuron\MyAgent;
use NeuronAI\Chat\Messages\UserMessage;
use NeuronAI\StructuredOutput\SchemaProperty;

/*
 * Define the output structure as a PHP class.
 */
class Person
{
    #[SchemaProperty(
        description: 'The user name',
        required: true
    )]
    public string $name;

    #[SchemaProperty(
        description: 'What the user love to eat'
    )]
    public string $preference;
}

/*
 * Talk to the agent requiring the structured output
 */
$person = MyAgent::make()->setThreadId('demo')->structured(
    new UserMessage("I'm John and I like pizza!"),
    Person::class
);

echo $person->name .' like '.$person->preference;
// John like pizza

Метод structured() возвращает готовый объект типа Person. Дальше с ним можно работать как с любым другим объектом. Подробности — в разделе Structured Output.

RAG

Для RAG нужны ещё два компонента поверх AI-провайдера: провайдер эмбеддингов и векторное хранилище. Базовый класс RAG — это заготовка, в которой вы описываете эти три вещи.

Для RAG в пакете тоже есть генератор:

vendor/bin/neuron make:rag MyChatBot

Дальше заполняете три метода:

use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\RAG\Embeddings\EmbeddingsProviderInterface;
use NeuronAI\RAG\Embeddings\VoyageEmbeddingProvider;
use NeuronAI\RAG\RAG;
use NeuronAI\RAG\VectorStore\PineconeVectorStore;
use NeuronAI\RAG\VectorStore\VectorStoreInterface;

class MyChatBot extends RAG
{
    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: 'ANTHROPIC_API_KEY',
            model: 'ANTHROPIC_MODEL',
        );
    }

    protected function embeddings(): EmbeddingsProviderInterface
    {
        return new VoyageEmbeddingProvider(
            key: 'VOYAGE_API_KEY',
            model: 'VOYAGE_MODEL'
        );
    }

    protected function vectorStore(): VectorStoreInterface
    {
        return new PineconeVectorStore(
            key: 'PINECONE_API_KEY',
            indexUrl: 'PINECONE_INDEX_URL'
        );
    }
}

В примере эмбеддинги считает Voyage, а хранит Pinecone. Подробности — в разделе RAG.

Workflow: когда готовых классов мало

Классы Agent и RAG — это готовые решения под типовые сценарии: поиск по базе, вызов инструментов, структурированный вывод. Workflow — другой уровень. Авторы описывают его как умную блок-схему для вашего приложения.

Смысл в другом: компоненты Neuron можно брать по отдельности, как детали конструктора. Это AI-провайдер, эмбеддинги, загрузчики данных, история чата, векторное хранилище. Из них вы собираете систему целиком, по тем правилам, которые нужны именно вам. Классы Agent и RAG при этом тоже можно использовать внутри Workflow как обычные компоненты, если их встроенных возможностей хватает.

Отдельная важная возможность Workflow — человек в контуре процесса. В любой момент процесс можно остановить и передать его человеку: проверить результат, поправить или добавить контекст. Это важно там, где ответ модели нужно подтвердить перед тем, как он уйдёт дальше по системе. Подробнее — в разделе Workflow и отдельной странице про human-in-the-loop.

Ещё два направления, о которых говорит README, — потоковая выдача ответа с адаптерами под интерфейсы и асинхронное выполнение. Это streaming и async.

Наблюдение и отладка

Агент в продакшене — это цепочка из множества шагов: вызовы LLM, работа с инструментами, чтение из внешней памяти. Когда шагов много, важно понять, что именно агент делает и почему он ответил именно так.

Стандартный путь в Neuron — сервис Inspector. После регистрации достаточно задать переменную окружения:

INSPECTOR_INGESTION_KEY=fwe45gtxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Дальше в панели Inspector появляется лента выполнения агента: сколько было вызовов, какие инструменты сработали, сколько занял каждый шаг. Подробности — в разделе Observability.

Скиллы и MCP-сервер для ИИ-агентов

Отдельный раздел README посвящён работе с ИИ-помощниками вроде Claude Code, OpenCode и Cursor. Авторы предлагают два способа дать модели глубокое понимание компонентов Neuron: скиллы и MCP-сервер. По их словам, это приводит к более точным подсказкам в коде, правильному пониманию API и меньшему числу выдумок.

Скиллы лежат прямо в пакете, в каталоге skills/, и ставятся одной командой из шага выше. На момент публикации их 13:

Скилл Задача
neuron-agent Базовый агент на чистом PHP
neuron-tool Инструменты
neuron-rag RAG
neuron-workflow Workflow
neuron-structured-output Структурированный вывод
neuron-streaming Потоковая выдача
neuron-monitoring Наблюдение и отладка
neuron-evaluation Оценка качества ответов
neuron-test Тестирование агентов
neuron-tool-approval Согласование вызова инструментов человеком
neuron-frontend-integration Связка с интерфейсом
neuron-laravel-integration Интеграция с Laravel
neuron-symfony-integration Интеграция с Symfony

Требования, версии и разработка

Требование к языку — PHP 8.1 или новее (^8.1). Пакет лежит на Packagist, официальная документация — на docs.neuron-ai.dev.

Разработчикам самого фреймворка тесты удобно гонять через Docker Compose. Он поднимает тот же набор сервисов, что и в CI:

# Start all services
docker compose up -d

# Install dependencies and run tests
docker compose run --rm php composer update --prefer-stable
docker compose run --rm php vendor/bin/phpunit

# To stop all services
docker compose down

Обнаруженные уязвимости авторы просят отправлять на support@inspector.dev. Лицензия MIT лежит в репозитории.

Итого

Neuron закрывает весь путь работы с агентами в одном PHP-проекте: выбор модели, инструменты, память, RAG, несколько агентов, человек в контуре, отладка. Если команда уже пишет на PHP, всё это живёт в том же проекте. Главный совет авторов — начинать с готовых классов Agent и RAG, а переходить на Workflow только тогда, когда типовое решение перестало хватать. И всегда ставьте скиллы из пакета: модель помнит старые версии API, а это источник ошибок.

Источник: https://github.com/neuron-core/neuron-ai