PHPackages                             itech-world/sulu-content-ai-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. itech-world/sulu-content-ai-bundle

ActiveSulu-bundle

itech-world/sulu-content-ai-bundle
==================================

AI-powered content assistant for Sulu CMS 3.x: fill page/article blocks from an in-admin chat and create drafts, powered by symfony/ai (multi-provider: OpenAI, Mistral, Anthropic)

v0.1.1(1mo ago)06↓75%MITPHPPHP ^8.2CI passing

Since Jul 16Pushed 1mo agoCompare

[ Source](https://github.com/steeven-th/SuluContentAiBundle)[ Packagist](https://packagist.org/packages/itech-world/sulu-content-ai-bundle)[ RSS](/packages/itech-world-sulu-content-ai-bundle/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (2)Dependencies (13)Versions (4)Used By (0)

 [![Itech World logo](./doc/images/logo.png)](./doc/images/logo.png)

Content AI Bundle
=================

[](#content-ai-bundle)

### AI-powered content assistant for [Sulu CMS 3.x](https://sulu.io)

[](#ai-powered-content-assistant-for-sulu-cms-3x)

 [ ![License](https://camo.githubusercontent.com/f8df3091bbe1149f398a5369b2c39e896766f9f6efba3477c63e9b4aa940ef14/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e) ](LICENSE) [ ![Sulu compatibility](https://camo.githubusercontent.com/c2518bccb7955fc7ec0e7795a08cc2bf5f44ff21fb62a122d060806c7d3983f5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73756c752d2533453d332e302d6379616e) ](https://sulu.io/) [![PHP](https://camo.githubusercontent.com/892aee1eacbcffed3b3bae96f95a6ab8f83193518a1123f7d58dc210af44d5df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d2533453d382e322d626c7565)](https://camo.githubusercontent.com/892aee1eacbcffed3b3bae96f95a6ab8f83193518a1123f7d58dc210af44d5df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d2533453d382e322d626c7565)

 Bring generative AI to your Sulu content, straight from the admin:
 generate and rewrite page/article blocks, a per-field writing assistant, automated SEO metadata,
 image metadata from vision, metadata translation, and reusable AI experts &amp; prompts.

 **Your own provider keys (OpenAI, Mistral, Anthropic), used directly — no SaaS in between.**

---

> ⚠️ **Work in progress.** This bundle is under active development. The public API and configuration may still change before `1.0`.

Requirements
------------

[](#requirements)

- PHP &gt;= 8.2 (with the bundled `sodium` extension, used to encrypt provider keys)
- Sulu CMS &gt;= 3.0
- Symfony &gt;= 7.0
- Doctrine ORM &gt;= 3.0
- [`symfony/ai`](https://github.com/symfony/ai) platform bridges `~0.10` (OpenAI, Mistral and/or Anthropic)

Features
--------

[](#features)

- **In-admin AI assistant** — a toolbar button on the page/article form opens a chat panel that can **generate** content (filling the document's blocks via structured output constrained to *your* templates) and **transform** existing content in place (translate, rephrase, shorten…) with natural-language targeting.
- **Per-field writing assistant** — an AI button overlaid on each text field opens a stateless *Writing Assistant* (selected text + an expert + a predefined prompt + a free instruction) that rewrites just that field, in its locale.
- **Automated SEO metadata** — a *Generate SEO tags* button on the SEO tab fills title, description and keywords from the page content.
- **Media metadata** — on the media form, *Generate metadata* describes an image with a vision model (title + alt-text), and *Translate metadata* translates the media metadata from one locale to another.
- **AI experts &amp; predefined prompts** — admin CRUD (under *Settings → AI Assistant*) to manage reusable experts (personas / brand voice) and predefined prompts, used by the writing assistant.
- **Provider configuration in the admin** — manage providers and API keys from the admin. **Keys are encrypted at rest**; the active provider is resolved dynamically, with a fallback to your `.env` configuration.
- **Multi-provider &amp; locale-aware** — OpenAI, Mistral, Anthropic. Output always follows the content locale, and a shared style guidance avoids the usual "AI tells" (em dashes, emojis, clichés).

Installation
------------

[](#installation)

### 1. Require the bundle

[](#1-require-the-bundle)

```
composer require itech-world/sulu-content-ai-bundle
```

### 2. Register the bundle

[](#2-register-the-bundle)

If Symfony Flex does not do it automatically:

```
// config/bundles.php
return [
    // ...
    ItechWorld\SuluContentAiBundle\ItechWorldSuluContentAiBundle::class => ['all' => true],
];
```

### 3. Register the routes

[](#3-register-the-routes)

```
# config/routes.yaml
itech_world_sulu_content_ai:
    resource: '@ItechWorldSuluContentAiBundle/src/Controller/'
    type: attribute

itech_world_sulu_content_ai_admin_api:
    resource: '@ItechWorldSuluContentAiBundle/config/routing_admin_api.yaml'
    prefix: /admin/api
```

### 4. Configure the AI providers

[](#4-configure-the-ai-providers)

The bundle consumes the `symfony/ai` platforms. Declare the providers you use and keep the keys in the environment:

```
# config/packages/ai.yaml
ai:
    platform:
        openai:
            api_key: '%env(OPENAI_API_KEY)%'
        anthropic:
            api_key: '%env(ANTHROPIC_API_KEY)%'
        mistral:
            api_key: '%env(MISTRAL_API_KEY)%'
```

```
# .env.local
MISTRAL_API_KEY=your-key-here
```

> You can also configure providers **from the admin** (*Settings → AI Assistant → Providers*), where the key is stored encrypted. When a provider is configured there, it takes precedence over the `.env` fallback.

### 5. Register the admin assets

[](#5-register-the-admin-assets)

Edit `assets/admin/package.json` to add the bundle to the dependencies:

```
{
    "dependencies": {
        // ...
        "sulu-itech-world-sulu-content-ai-bundle": "file:../../vendor/itech-world/sulu-content-ai-bundle/public/js"
    }
}
```

Edit `assets/admin/app.js` to import the bundle:

```
import 'sulu-itech-world-sulu-content-ai-bundle';
```

In the `assets/admin/` folder, install and rebuild the admin assets:

```
npm install
npm run build
```

### 6. Update the database schema

[](#6-update-the-database-schema)

```
php bin/console doctrine:schema:update --force
# or generate and run a migration
```

### 7. Clear the cache

[](#7-clear-the-cache)

```
php bin/adminconsole cache:clear
php bin/console cache:clear
```

Configuration
-------------

[](#configuration)

The bundle exposes a minimal configuration under the `itech_world_sulu_content_ai` key:

```
# config/packages/itech_world_sulu_content_ai.yaml
itech_world_sulu_content_ai:
    default_provider: mistral            # openai | anthropic | mistral (env fallback)
    model: 'mistral-small-latest'        # text model (needs json_schema support)
    vision_model: 'pixtral-12b-latest'   # vision model for image metadata
    encryption_key: '%env(APP_SECRET)%'  # secret used to encrypt provider keys at rest
```

See [`doc/configuration.md`](doc/configuration.md) for the full setup (agent configuration, per-field button positioning, etc.).

Usage
-----

[](#usage)

Everything happens from the Sulu admin:

- **Pages / articles** — the *AI Assistant* toolbar button (chat) and the per-field AI button on text fields.
- **SEO tab** — the *Generate SEO tags* button.
- **Media** — the *Generate metadata* (vision) and *Translate metadata* buttons.
- **Settings → AI Assistant** — manage **Experts**, **Prompts** and **Providers** (API keys, models).

> The generated content is inserted into the form as unsaved changes: review it, then save (or discard) as usual.

Architecture
------------

[](#architecture)

```
SuluContentAiBundle/
├── config/                 # Services, admin API routing, list/form metadata, image formats
├── src/
│   ├── Admin/              # Sulu admin integration (toolbar actions, settings views)
│   ├── Ai/                 # Generators, platform resolver, field mappers orchestration
│   ├── Controller/         # Back-office API (chat, SEO, media, per-field, providers)
│   ├── Entity/             # Conversations, experts, prompts, provider configs
│   ├── Repository/
│   ├── Schema/             # Template/block introspection → JSON Schema
│   └── Security/           # API key encryption
├── public/js/              # Admin React components (toolbar actions, field types)
├── translations/           # Admin translations (en, fr, de)
└── doc/                    # Documentation

```

Available translations
----------------------

[](#available-translations)

- English
- French
- German

🐛 Bug and Idea
--------------

[](#-bug-and-idea)

See the [open issues](https://github.com/steeven-th/SuluContentAiBundle/issues) for a list of proposed features (and known issues).

💰 Support me
------------

[](#-support-me)

You can buy me a coffee to support me — **this bundle is 100% free**.

[Buy me a coffee](https://www.buymeacoffee.com/steeven.th)

👨‍💻 Contact
-----------

[](#‍-contact)

[![](https://avatars.githubusercontent.com/u/82022828?s=96&v=4)](https://steeven-th.dev)[![x.com](./doc/images/x.webp)](https://x.com/ThomasSteeven2)[![Linkedin](./doc/images/linkedin.png)](https://www.linkedin.com/in/steeven-thomas-221b02b8/)

📘 License
---------

[](#-license)

This bundle is under the [MIT License](LICENSE).

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance91

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 Bus Factor1

Top contributor holds 88.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

46d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/15d31371355db522b06ffd73f8be76e32972f145390b1eba33b190c7fd412413?d=identicon)[steeven-th](/maintainers/steeven-th)

---

Top Contributors

[![steeven-th](https://avatars.githubusercontent.com/u/82022828?v=4)](https://github.com/steeven-th "steeven-th (8 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (1 commits)")

---

Tags

phpsymfonyaiopenaicmsllmanthropicsulumistralContent Generation

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/itech-world-sulu-content-ai-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/itech-world-sulu-content-ai-bundle/health.svg)](https://phpackages.com/packages/itech-world-sulu-content-ai-bundle)
```

###  Alternatives

[rcsofttech/audit-trail-bundle

Enterprise-grade, high-performance Symfony audit trail bundle. Automatically track Doctrine entity changes with split-phase architecture, multiple transports (HTTP, Queue, Doctrine), and sensitive data masking.

12323.1k](/packages/rcsofttech-audit-trail-bundle)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.4k1.4M241](/packages/sulu-sulu)[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k18.7M445](/packages/easycorp-easyadmin-bundle)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k4.0M552](/packages/pimcore-pimcore)[kimai/kimai

Kimai - Time Tracking

5.0k9.7k1](/packages/kimai-kimai)[2lenet/crudit-bundle

The easy like Crud'it Bundle.

1718.2k18](/packages/2lenet-crudit-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
