Skip to content
Snippets Groups Projects
Commit d360a6c6 authored by Marcus Johansson's avatar Marcus Johansson
Browse files

Issue #3471259 by marcus_johansson: Vector dimension mismatch when using Zilliz

parent 2695f93a
No related branches found
No related tags found
No related merge requests found
Pipeline #271634 passed with warnings
......@@ -4,8 +4,6 @@ namespace Drupal\ai_search\Trait;
use Drupal\ai\AiProviderInterface;
use Drupal\ai\Plugin\ProviderProxy;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformStateInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
......@@ -35,21 +33,7 @@ trait AiSearchBackendEmbeddingsEngineTrait {
* The configuration.
*/
public function setEngineConfiguration(array $configuration): void {
// Load data.
if (isset($configuration['embeddings_engine'])) {
$plugin_manager = \Drupal::service('ai.provider');
$parts = explode('__', $configuration['embeddings_engine']);
$rule = $plugin_manager->createInstance($parts[0])->getAvailableConfiguration('embeddings', $parts[1]);
$this->engineConfiguration = $configuration;
foreach ($rule as $key => $value) {
if ($key == 'dimensions') {
$this->engineConfiguration['embeddings_engine_configuration'][$key] = $value['default'];
}
}
}
else {
$this->engineConfiguration = $configuration;
}
$this->engineConfiguration = $configuration;
}
/**
......@@ -85,11 +69,14 @@ trait AiSearchBackendEmbeddingsEngineTrait {
if ($form_state instanceof SubformStateInterface) {
$form_state = $form_state->getCompleteFormState();
}
if (empty($this->engineConfiguration)) {
$this->engineConfiguration = $this->defaultEngineConfiguration();
}
/** @var \Drupal\Core\Entity\Form $form_object */
$form_object = $form_state->getFormObject();
$entity = $form_object->getEntity();
$form['embeddings_engine'] = [
'#type' => 'select',
'#title' => $this->t('Embeddings Engine'),
......@@ -98,14 +85,14 @@ trait AiSearchBackendEmbeddingsEngineTrait {
'#default_value' => $this->getConfiguration()['embeddings_engine'] ?? $this->defaultEngineConfiguration()['embeddings_engine'],
'#description' => $this->t('The service to use for embeddings. If you change this, everything will be needed to be reindexed.'),
'#weight' => 20,
// If its update, we don't allow to change the embeddings engine.
'#disabled' => !empty($this->engineConfiguration['embeddings_engine']),
'#ajax' => [
'callback' => [$this, 'updateEmbeddingEngineConfigurationForm'],
'wrapper' => 'embedding-engine-configuration-wrapper',
'method' => 'replaceWith',
'effect' => 'fade',
],
// This is disabled if its editing.
'#disabled' => !$entity->isNew(),
];
$form['embeddings_engine_configuration'] = [
......@@ -116,20 +103,38 @@ trait AiSearchBackendEmbeddingsEngineTrait {
'#weight' => 25,
];
$form['embeddings_engine_configuration']['set_dimensions'] = [
'#type' => 'checkbox',
'#title' => $this->t('Set Dimensions Manually'),
'#description' => $this->t('This is for advanced usage, when you want to use custom embeddings engines.'),
'#default_value' => FALSE,
// This is disabled if its editing.
'#disabled' => !$entity->isNew(),
];
$form['embeddings_engine_configuration']['dimensions'] = [
'#type' => 'number',
'#title' => $this->t('Dimensions'),
'#description' => $this->t('The number of dimensions for the embeddings.'),
'#default_value' => $this->engineConfiguration['embeddings_engine_configuration']['dimensions'] ?? '',
'#required' => TRUE,
// If its update, we don't allow to change the dimensions.
'#disabled' => !empty($this->engineConfiguration['embeddings_engine']),
// Load via ajax calls.
'#attributes' => [
'class' => ['embeddings-engine-configuration-dimensions'],
'#states' => [
'disabled' => [
':input[name="backend_config[embeddings_engine_configuration][set_dimensions]"]' => ['checked' => FALSE],
],
],
];
// If the embeddings engine is set, add the configuration form.
if (!empty($this->engineConfiguration['embeddings_engine']) || $form_state->getValue('embeddings_engine')) {
$plugin_manager = \Drupal::service('ai.provider');
$parts = explode('__', $this->engineConfiguration['embeddings_engine'] ?? $form_state->get('embeddings_engine'));
$rule = $plugin_manager->createInstance($parts[0])->getAvailableConfiguration('embeddings', $parts[1]);
foreach ($rule as $key => $value) {
$form['embeddings_engine_configuration'][$key]['#default_value'] = $value['default'];
}
}
return $form;
}
......@@ -185,27 +190,11 @@ trait AiSearchBackendEmbeddingsEngineTrait {
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return array|AjaxResponse
* @return array
* The updated form.
*/
public function updateEmbeddingEngineConfigurationForm(array $form, FormStateInterface $form_state): array|AjaxResponse {
$plugin_manager = \Drupal::service('ai.provider');
$parts = explode('__', $form_state->getValue('backend_config')['embeddings_engine']);
if (count($parts) !== 2) {
return $form['backend_config']['embeddings_engine_configuration'];
}
// The subform reload doesn't work, so AjaxResponse is needed.
$dimensions = $this->engineConfiguration['embeddings_engine_configuration']['dimensions'] ?? 768;
$rule = $plugin_manager->createInstance($parts[0])->getAvailableConfiguration('embeddings', $parts[1]);
foreach ($rule as $key => $value) {
if ($key == 'dimensions') {
$dimensions = $value['default'];
}
}
$response = new AjaxResponse();
$add_value = new InvokeCommand('.embeddings-engine-configuration-dimensions', 'val', [$dimensions]);
$response->addCommand($add_value);
return $response;
public function updateEmbeddingEngineConfigurationForm(array $form, FormStateInterface $form_state): array {
return $form['backend_config']['embeddings_engine_configuration'];
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment