websystems / web-prompt-creator-bundle
为 Symfony 开发的 OpenAI 提示创建器
0.0.14
2024-06-19 13:10 UTC
Requires
- php: ^8.1
README
for Symfony & EasyAdmin
WPC 是 OpenAi(或其他)提示的拖放式构建器。
通过 WPC,您可以设计复杂的提示,这些提示可以在最终响应之前发送多个请求
要求
- Symfony UX Vue https://symfony.com.cn/bundles/ux-vue/current/index.html
安装
安装 WPC
composer require websystems/web-prompt-creator-bundle
创建服务,该服务将覆盖输入数据 $options 将在输入小部件中使用,并在发送到 AI 之前更新值
namespace App\Service; use Websystems\WebPromptCreatorBundle\PromptInputOptions\PromptInputOptions; class PromptInputOptionsService extends PromptInputOptions { public function configureOptions(): array { $options = [ 'input_content' => '', 'other_input_data' => '', ]; return $options; } }
配置 EasyAdmin crud 控制器,并添加名为 "Add PromptField" 的服务,并将自定义选项 "input" 与服务选项一起设置
public function __construct( ... private PromptInputOptionsService $promptInputOptionsService, ) { } ... public function configureFields(string $pageName): iterable { return [ PromptField::new('prompt') ->setCustomOption("input", $this->promptInputOptionsService->getInputOptions())->hideOnIndex(),
在 templates/admin 中创建此字段的覆盖模板,例如。 web_prompt_creator.html.twig 在 {% block _Prompt_prompt_widget %} 提示是实体名称,_prompt 是实体属性名称参数
- element_hidden - 如果 true 则块将显示 <input type="hidden"... 字段,如果 false 则 <textarea>
- element_value - 字段值
- element_id - 字段 id
- element_name - 字段名称
- input - 您的服务中的 "input" 数据
{% block _Prompt_prompt_widget %} <div {{ vue_component('WebPromptCreator', { 'element_hidden': true, 'element_value': form.vars.value, 'element_id': form.vars.id, 'element_name': form.vars.full_name, 'input': form.vars.ea_vars.field.customOptions.get('input'), }) }}></div> {% endblock %}
将表单主题添加到 crud 控制器
public function configureCrud(Crud $crud): Crud { return $crud ->setFormThemes(['admin/web_prompt_creator.html.twig', '@EasyAdmin/crud/form_theme.html.twig']) ; }
通过添加 js 和 css 文件配置资源
... use Websystems\WebPromptCreatorBundle\Asset\AssetPackage; ... public function __construct( ... protected RequestStack $requestStack, ) { } ... public function configureAssets(Assets $assets): Assets { $assetPackage = new AssetPackage($this->requestStack); return $assets ->addJsFile($assetPackage->getUrl('437.js')) ->addJsFile($assetPackage->getUrl('runtime.js')) ->addJsFile($assetPackage->getUrl('builder.js')) ->addCssFile($assetPackage->getUrl('437.css')) ->addCssFile($assetPackage->getUrl('builder.css')) ; }
使用方法
WPC 创建存储在数据库中的 JSON 数据。有一些函数可以处理此 JSON 并处理最终响应。
如果您有一个用于向 AI 发送请求的 API 类,则它必须实现接口
... use Websystems\WebPromptCreatorBundle\AiInterface; class OpenAi implements AiInterface { public function supports($type): bool { return is_a($this, $type, true); } public function send(array $messages): ?array { ... return [ 'content' => $response['choices'][0]['message']['content'], 'data' => $response, ]; }
如果您想在控制器中处理,则必须使用依赖注入来获取服务
... public function __construct( private OpenAi $openAi, private WebPromptCreator $webPromptCreator, private PromptInputOptionsService $promptInputOptionsService, ) { }
并将重要内容添加到 webPromptCreator 实例中 createRequests() - 将发送请求到 ai 并处理所有内容
$json = $someRepository->find(...) $contentToProcess = "Some content to process"; $this->webPromptCreator->setPromptData(json_decode($json, true)); $this->webPromptCreator->setAiService($this->openAi); $this->promptInputOptionsService->updateOptionByKey('input_content', $contentToProcess); ... $this->webPromptCreator->setInputData($this->promptInputOptionsService); $this->webPromptCreator->createRequests();
读取最终响应
$this->webPromptCreator->getFinalResponse();
通过请求的 UID 读取响应
getResponseOfRequestByUid($uid)
通过请求小部件的 UID 读取响应数据
getResponseDataOfRequestByUid($uid)
getRequestCollection() getPromptRequestCollectionAsArrayConversation(bool $withAnswers = false)
showDummyCoversation 与 createRequests() 类似,但不会向 AI 发送请求并创建带有模拟数据的 PromptRequestCollection
showDummyCoversation(string $responseText = "This is a dummy response")