addMarkers($this->_aBrowseParams);
}
protected function _delete ($mixedId)
{
// TODO: delete files from vector store
$r = $this->getVectorStoreDataById($mixedId);
$oVectorStore = BxDolAI::getVectorStoreInstance($r['vector_store_id']);
if ($oVectorStore) {
$oVectorStore->deleteBySource($r['vector_store_id'], $r['id']);
}
$mixedResult = parent::_delete($mixedId);
return $mixedResult;
}
protected function _getCellSize ($mixedValue, $sKey, $aField, $aRow)
{
$mixedValue = bx_format_bytes($mixedValue);
return parent::_getCellDefault ($mixedValue, $sKey, $aField, $aRow);
}
protected function _getCellStatus ($mixedValue, $sKey, $aField, $aRow)
{
switch ($mixedValue) {
case 'pending':
$mixedValue = '⏳';
break;
case 'processing':
$mixedValue = '⚙️';
break;
case 'ready':
$mixedValue = '✅';
break;
case 'error':
$mixedValue = '❌';
break;
}
return parent::_getCellDefault ($mixedValue, $sKey, $aField, $aRow);
}
static public function processPendingData()
{
$iLimit = 5; // TODO: add to settings
for ($i = 0; $i < $iLimit; $i++) {
$a = BxDolAiQuery::getVectorStorePendingData(1);
if (!$a)
break;
foreach ($a as $r) {
BxDolAiQuery::updateVectorStoreDataStatus($r['id'], 'processing');
$aVectorStore = BxDolAiQuery::getVectorStoreObject($r['vector_store_id']);
$oVectorStore = BxDolAI::getVectorStoreInstance($aVectorStore['id']);
$oEmbedder = BxDolAI::getModelInstance($aVectorStore['embedding_provider_id']);
$sError = '';
if ($oEmbedder && $oVectorStore) {
try {
$aSettings = $r['settings'] ? json_decode($r['settings'], true) : [];
$aMetadata = $r['metadata'] ? json_decode($r['metadata'], true) : [];
$documents = NeuronAI\RAG\DataLoader\StringDataLoader::for($r['content'])
->withSplitter(
new NeuronAI\RAG\Splitter\DelimiterTextSplitter(
maxLength: isset($aSettings['chunk_size']) ? $aSettings['chunk_size'] : 512,
separator: isset($aSettings['delimiter']) ? $aSettings['delimiter'] : '.',
wordOverlap: isset($aSettings['overlap']) ? $aSettings['overlap'] : 2
)
)
->getDocuments();
foreach ($documents as $document) {
$document->sourceType = $r['vector_store_id'];
$document->sourceName = $r['id'];
if (!empty($aMetadata))
$document->metadata = $aMetadata;
}
$oVectorStore->addDocuments(
$oEmbedder->embedDocuments($documents)
);
}
catch (Exception $e) {
$sError = "Error process vector store data ({$r['id']}): " . $e->getMessage();
}
if (!$sError)
BxDolAiQuery::updateVectorStoreDataStatus($r['id'], 'ready');
}
else {
$sError = "Can't process vector store data with id {$r['id']}, missing embedder({$aVectorStore['embedding_provider_id']}) or vector store({$aVectorStore['id']}) instance";
}
if ($sError) {
bx_log('sys_agents', $sError, BX_LOG_ERR);
BxDolAiQuery::updateVectorStoreDataStatus($r['id'], 'error');
}
}
}
}
}
/** @} */