improve interacting with ollama api and models
This commit is contained in:
96
app/Concerns/InteractsWithEmbeddingWorkbench.php
Normal file
96
app/Concerns/InteractsWithEmbeddingWorkbench.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace App\Concerns;
|
||||
|
||||
use App\Models\EmbeddingEntry;
|
||||
use App\Services\EmbeddingWorkbench;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
trait InteractsWithEmbeddingWorkbench
|
||||
{
|
||||
public string $embeddingModel = '';
|
||||
|
||||
/** @var array<int, array{name: string, dimensions: int}> */
|
||||
public array $modelOptions = [];
|
||||
|
||||
public string $providerSummary = '';
|
||||
|
||||
public int $storedCount = 0;
|
||||
|
||||
public bool $databaseReady = true;
|
||||
|
||||
public bool $ollamaAvailable = false;
|
||||
|
||||
public string $ollamaStatusMessage = '';
|
||||
|
||||
public string $ollamaUrl = '';
|
||||
|
||||
public function refreshOllama(EmbeddingWorkbench $workbench): void
|
||||
{
|
||||
$this->initializeWorkbench($workbench);
|
||||
}
|
||||
|
||||
protected function initializeWorkbench(EmbeddingWorkbench $workbench): void
|
||||
{
|
||||
$status = $workbench->ollamaStatus();
|
||||
|
||||
$this->ollamaAvailable = $status['available'];
|
||||
$this->ollamaStatusMessage = $status['message'];
|
||||
$this->ollamaUrl = $status['url'];
|
||||
$this->modelOptions = $workbench->modelOptions();
|
||||
|
||||
if (! $this->ollamaAvailable) {
|
||||
$this->embeddingModel = '';
|
||||
} elseif ($this->embeddingModel === '' || ! collect($this->modelOptions)->pluck('name')->contains($this->embeddingModel)) {
|
||||
$this->embeddingModel = $workbench->modelName();
|
||||
}
|
||||
|
||||
$this->refreshSummary($workbench);
|
||||
}
|
||||
|
||||
protected function ensureWorkbenchAvailable(EmbeddingWorkbench $workbench, string $databaseErrorField): bool
|
||||
{
|
||||
$this->initializeWorkbench($workbench);
|
||||
|
||||
if (! $this->ollamaAvailable) {
|
||||
$this->addError('embeddingModel', $this->ollamaStatusMessage);
|
||||
}
|
||||
|
||||
if (! $this->databaseReady) {
|
||||
$this->addError($databaseErrorField, __('The embedding table is not ready.'));
|
||||
}
|
||||
|
||||
return $this->ollamaAvailable && $this->databaseReady && $this->embeddingModel !== '';
|
||||
}
|
||||
|
||||
protected function refreshSummary(EmbeddingWorkbench $workbench): void
|
||||
{
|
||||
$provider = $workbench->providerName();
|
||||
|
||||
$this->databaseReady = Schema::hasTable('embedding_entries');
|
||||
|
||||
if (! $this->ollamaAvailable || $this->embeddingModel === '') {
|
||||
$this->providerSummary = "{$provider} / unavailable";
|
||||
$this->storedCount = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$model = $workbench->modelName($this->embeddingModel);
|
||||
$dimensions = $workbench->dimensions($model);
|
||||
|
||||
$this->providerSummary = "{$provider} / {$model} / {$dimensions}d";
|
||||
|
||||
if (! $this->databaseReady) {
|
||||
$this->storedCount = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->storedCount = EmbeddingEntry::query()
|
||||
->where('provider', $provider)
|
||||
->where('model', $model)
|
||||
->where('embedding_dimensions', $dimensions)
|
||||
->count();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user