feat(阶段三): 实现AI提示词编辑功能

- 集成 Monaco Editor 用于提示词编辑
- 创建提示词变量配置(14个可用变量)
- 创建提示词模板库(5个预设模板)
- 实现 PromptTemplateService 服务类
- 创建变量替换和预览功能
- 添加 PreviewPromptAction 用于预览提示词
- 创建变量帮助文档和模板选择器视图组件
- 支持变量验证和自动替换
This commit is contained in:
2026-03-09 10:59:45 +08:00
parent 3b90d97f02
commit 1d30fb1d4c
11 changed files with 866 additions and 1 deletions

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Filament\Actions;
use App\Services\PromptTemplateService;
use Filament\Actions\Action;
use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\ViewField;
use Filament\Support\Enums\MaxWidth;
class PreviewPromptAction
{
/**
* 创建预览提示词的Action
*
* @return Action
*/
public static function make(): Action
{
return Action::make('previewPrompt')
->label('预览提示词')
->icon('heroicon-o-eye')
->color('info')
->modalHeading('提示词预览')
->modalDescription('查看变量替换后的实际提示词内容')
->modalWidth(MaxWidth::FourExtraLarge)
->modalSubmitAction(false)
->modalCancelActionLabel('关闭')
->form(function ($record, $livewire) {
$service = app(PromptTemplateService::class);
// 获取当前表单数据
$data = $livewire->data ?? [];
$promptTemplate = $data['prompt']['prompt_template'] ?? '';
if (empty($promptTemplate)) {
return [
Placeholder::make('empty')
->label('')
->content('请先输入提示词模板内容'),
];
}
// 如果是编辑模式,使用记录的终端信息
// 如果是创建模式,使用表单数据创建临时终端对象
if ($record) {
$terminal = $record;
} else {
// 创建临时终端对象用于预览
$terminal = new \App\Models\Terminal([
'name' => $data['name'] ?? '新终端',
'code' => $data['code'] ?? 'TEMP-001',
'station_id' => $data['station_id'] ?? null,
]);
}
// 替换变量
$previewContent = $service->replaceVariables($promptTemplate, $terminal);
// 验证变量
$invalidVariables = $service->validateVariables($promptTemplate);
return [
Placeholder::make('original')
->label('原始模板')
->content(function () use ($promptTemplate) {
return view('filament.components.prompt-preview-original', [
'content' => $promptTemplate,
]);
}),
Placeholder::make('preview')
->label('预览结果')
->content(function () use ($previewContent) {
return view('filament.components.prompt-preview-result', [
'content' => $previewContent,
]);
}),
Placeholder::make('validation')
->label('变量验证')
->content(function () use ($invalidVariables) {
return view('filament.components.prompt-preview-validation', [
'invalidVariables' => $invalidVariables,
]);
})
->visible(fn () => !empty($invalidVariables)),
];
});
}
}