Unchain the power of AI in your Filament Panel! With this plugin you can easily let AI write all your content.
You need Filament v3, a valid license and an OpenAI API Token.
To install the package via composer you need to add the private repository to your composer.json.
"repositories": [
{
"type": "composer",
"url": "https://filament-plugin-ai-writer.composer.sh"
}
]
Now you are ready to install the package:
composer require mvenghaus/filament-plugin-ai-writer:"^3.0"
You will be asked for a username and password. Use your order email address as username and the license key you received as password.
Register the plugin in panel provider:
use Mvenghaus\FilamentPluginAIWriter\FilamentPlugin;
use Mvenghaus\FilamentPluginAIWriter\Integrations\OpenAI\OpenAI;
use Mvenghaus\FilamentPluginAIWriter\Integrations\OpenAI\Models\Gpt4;
...
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
...
->plugin(
FilamentPlugin::make(
// create the Open AI Integration
OpenAI::make(
'YOUR_TOKEN',
// choose the model you want to use
Gpt4::make(
maxTokens: 100 // optional
)
)
)
)
}
}
...
You are free to store the token wherever you want. But if you only have one global token it's a good practice to store it in .env and resolving it using the services config.
OPENAI_TOKEN="MY_TOKEN"
<?php
return [
...
'openai' => [
'token' => env('OPENAI_TOKEN')
]
];
OpenAI::make(config('services.openai.token'), ...);
To limit your costs you can use the maxTokens option.
Basically the integration is "just" a button, but a very powerful one.
The principle is always structured as follows:
************ ************ ************
* SOURCE * --> * MODIFY * --> * TARGET *
************ ************ ************
<?php
use Mvenghaus\FilamentPluginAIWriter\Forms\Components\AIWriterButton;
...
public static function form(Form $form): Form
{
return $form
->schema([
AIWriterButton::make('name')
->label(...) // optional
->source(...)
->sourceModal(...) // optional
->modify(...) // optional
->target(...)
...
The source accpets a Closure and defines the request text that is send to the AI integration. The Closure is evaluated like everything in Filament so you can use "Get", "Set", etc..
->source(fn() => 'Tell me a joke about PHP')
->source(fn(Get $get) => $get('source_field'))
Maybe you just want to generate a text on the fly without having any source text or field. There comes the "sourceModal" method in handy.
->sourceModal()
With this you get a modal with a textarea where you can enter your request text.
You can also combine it with the "source" method to get a prefilled modal form.
->source(fn() => 'Prefilled Text')
->sourceModal()
Modify also accepts a Closure as parameter. Here you have the possibility to manipulate the request text before it is send to the integration.
You get string $sourceText
as param in your Closure.
This is for example useful when you want to work with placeholders in your request text.
Let's assume you have a form with a title and want to write a text with a predefined specification:
->source(fn() => 'Write a text about "#title#" in 10 words')
->sourceModal()
->modify(
fn(Get $get, string $sourceText) => str_replace('#title#', $get('title'), $sourceText)
)
At last there is the target. Here you decide what you want to do with the generated text. Here you also work with a Closure. As Closure parameter you get a response data object.
/** @var \Mvenghaus\FilamentPluginAIWriter\Data\Response $reponse */
$response->text // string - the generated text
$response->information // array - additional information from the integration response
Writing the text to a field would look like this:
->source(fn(Get $get) => $get('source_field'))
->target(fn(Set $set, Response $response) => $set('target_field', $response->text))
With this flexible structure you can do a lot of awesome things. Let's dive into some examples.
Code
AIWriterButton::make('generate')
->source(fn(Get $get) => $get('source_field'))
->target(fn(Set $set, Response $response) => $set('target_field', $response->text))
Demo
Code
AIWriterButton::make('generate')
->label('Add Content')
->sourceModal()
->target(function(Get $get, Set $set, Response $response) {
$set(
'target_field',
trim(sprintf("%s\n\n%s", $get('target_field'), $response->text))
);
}),
Demo
Code
AIWriterButton::make('translate')
->source(fn(Get $get) => 'translate in german: '. $get('description')))
->target(fn(Set $set, Response $response) => $set('description', $response->text))
Demo
Code
AIWriterButton::make('generate')
->source(function(Get $get) {
return implode("\n", [
'write a product description:',
'Name: ' . $get('name'),
'Type: ' . $get('type'),
'Color: ' . $get('color'),
'Sizes: ' . $get('sizes'),
]);
})
->target(fn(Set $set, Response $response) => $set('description', $response->text)),
Demo
You can also use the integration without the form component.
<?php
use Mvenghaus\FilamentPluginAIWriter\Integrations\OpenAI;
use Mvenghaus\FilamentPluginAIWriter\Integrations\OpenAI\Models\Gpt4;
$integration = OpenAI::make('YOUR_TOKEN', Gpt4::make());
$response = $integration->request('Tell me a joke');
echo $response->text;
Currently only Open AI is supported. But you can easily write your own integration. To achive this you simply have to implement the "Integration" contract.
<?php
use Mvenghaus\FilamentPluginAIWriter\Contracts\Integration;
use Mvenghaus\FilamentPluginAIWriter\Data\Response;
class MyIntegration implements Integration
{
public function request(string $text): Response
{
// call your ai provider
$result = (...);
return new Response(
content: $result
);
}
}
And then pass your Integration in the admin panel provider:
use Mvenghaus\FilamentPluginAIWriter\FilamentPlugin;
...
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
...
->plugin(
FilamentPlugin::make(new MyIntegration())
)
}
}
...
If you any questions or you find a bug, please let me now at Github or reach out on Discord.