diff --git a/src/Admin/OpenAI/AssistantAdmin.php b/src/Admin/OpenAI/AssistantAdmin.php index a1d28181bdf..6ec0e6db902 100644 --- a/src/Admin/OpenAI/AssistantAdmin.php +++ b/src/Admin/OpenAI/AssistantAdmin.php @@ -25,6 +25,8 @@ protected function configureFormFields(FormMapper $form): void ]) ->add('openAiId', TextType::class, [ 'label' => 'ID OpenAI', + 'help_html' => true, + 'help' => 'ID commençant par asst_', ]) ->end() ; diff --git a/src/Entity/OpenAI/Assistant.php b/src/Entity/OpenAI/Assistant.php index 0fd3347c541..5727ec96d48 100644 --- a/src/Entity/OpenAI/Assistant.php +++ b/src/Entity/OpenAI/Assistant.php @@ -6,6 +6,7 @@ use App\Entity\EntityIdentityTrait; use App\Entity\EntityTimestampableTrait; use App\OpenAI\Model\AssistantInterface; +use App\Validator\OpenAI\ValidAssistantId; use Doctrine\ORM\Mapping as ORM; use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; @@ -35,6 +36,7 @@ class Assistant implements AssistantInterface * @ORM\Column(unique=true) * * @Assert\NotBlank + * @ValidAssistantId */ public ?string $openAiId = null; diff --git a/src/OpenAI/Client/Client.php b/src/OpenAI/Client/Client.php index 3613387df45..240924b73cb 100755 --- a/src/OpenAI/Client/Client.php +++ b/src/OpenAI/Client/Client.php @@ -6,6 +6,9 @@ use App\OpenAI\Enum\MessageRoleEnum; use App\OpenAI\Enum\RunStatusEnum; use OpenAI\Client as OpenAIClient; +use OpenAI\Exceptions\ErrorException; +use OpenAI\Exceptions\TransporterException; +use OpenAI\Exceptions\UnserializableResponse; class Client implements ClientInterface { @@ -16,6 +19,17 @@ public function __construct(string $openAIApiKey) $this->openAI = \OpenAI::client($openAIApiKey); } + public function hasAssistant(string $assistantId): bool + { + try { + $this->openAI->assistants()->retrieve($assistantId); + + return true; + } catch (ErrorException|UnserializableResponse|TransporterException $e) { + return false; + } + } + public function createThread(): string { $threadResponse = $this->openAI->threads()->create([]); diff --git a/src/OpenAI/Client/ClientInterface.php b/src/OpenAI/Client/ClientInterface.php index fa4a92218d3..ee5e2934a64 100755 --- a/src/OpenAI/Client/ClientInterface.php +++ b/src/OpenAI/Client/ClientInterface.php @@ -7,6 +7,8 @@ interface ClientInterface { + public function hasAssistant(string $assistantId): bool; + public function createThread(): string; public function createUserMessage(string $threadId, string $content): string; diff --git a/src/Validator/OpenAI/ValidAssistantId.php b/src/Validator/OpenAI/ValidAssistantId.php new file mode 100644 index 00000000000..a3d9c1c1e4a --- /dev/null +++ b/src/Validator/OpenAI/ValidAssistantId.php @@ -0,0 +1,14 @@ +client->hasAssistant($value)) { + $this->context + ->buildViolation($constraint->errorMessage) + ->setParameter('{{ value }}', $value) + ->addViolation() + ; + } + } +} diff --git a/tests/OpenAI/Client/Client.php b/tests/OpenAI/Client/Client.php index 7c5678e2524..9aa50a7b326 100644 --- a/tests/OpenAI/Client/Client.php +++ b/tests/OpenAI/Client/Client.php @@ -20,6 +20,11 @@ public function __construct() $this->faker = Factory::create('fr_FR'); } + public function hasAssistant(string $assistantId): bool + { + return str_starts_with($assistantId, 'asst_'); + } + public function createThread(): string { return uniqid('thread_'); diff --git a/translations/validators.fr.yml b/translations/validators.fr.yml index 44944bcdd16..aa62cc21603 100644 --- a/translations/validators.fr.yml +++ b/translations/validators.fr.yml @@ -620,3 +620,5 @@ admin.adherent.renaissance.membership_type.invalid_choice: Ce type d'adhésion n admin.membership.cotisation_amount_choice.not_blank: Veuillez spécifier un montant de cotisation. admin.membership.cotisation_amount_choice.invalid_choice: Ce montant de cotisation est invalide. + +admin.openai.assistant.not_valid: Impossible de récupérer les données de l'assistant "{{ value }}".