Files
ABSDEV/Modules/AI/Services/KnowledgeIndexer.php
T
Mark Gregory 5dbb04e3ad AI provider management
* OpenAI-compatible provider adapter
* OpenAI support
* LM Studio support
* Ollama OpenAI-compatible support
* Encrypted API-key storage
* Default provider and model selection
* Provider connection testing
* Reusable prompt library
* Prompt variables and templates
* Prompt version field
* AI execution history
* Token-usage storage
* Duration and failure tracking
* Manual knowledge sources
* Knowledge-source chunking
* Knowledge indexing status
* Authenticated AI REST endpoint
* AI administration dashboard
* AI permissions
* Module registration and boot test
2026-07-24 13:01:56 +01:00

21 lines
1.0 KiB
PHP

<?php
namespace Modules\AI\Services;
use Modules\AI\Models\AIKnowledgeSource;
final class KnowledgeIndexer
{
public function index(AIKnowledgeSource $source,int $chunkSize=1800): AIKnowledgeSource
{
$content=trim((string)$source->content); $source->chunks()->delete();
$chunks=$content===''?[]:$this->split($content,max(500,$chunkSize));
foreach($chunks as $position=>$chunk) $source->chunks()->create(['position'=>$position+1,'content'=>$chunk]);
$source->update(['checksum'=>hash('sha256',$content),'status'=>'indexed','chunk_count'=>count($chunks),'indexed_at'=>now()]);
return $source->refresh();
}
private function split(string $content,int $size): array
{
$paragraphs=preg_split('/\R{2,}/',$content) ?: [$content]; $chunks=[]; $buffer='';
foreach($paragraphs as $paragraph){ if(strlen($buffer)+strlen($paragraph)+2>$size && $buffer!==''){ $chunks[]=trim($buffer); $buffer=''; } $buffer.=$paragraph."\n\n"; }
if(trim($buffer)!=='') $chunks[]=trim($buffer); return $chunks;
}
}