feat: Enhance Support Reply Service with tone instructions and article details

- Added tone instruction retrieval to SupportReplyService.
- Improved user feedback when no relevant article is found.
- Included article URL and tone instruction in LLM prompt.
- Updated response format to include source information.
- Enhanced article management UI with search functionality and editing capabilities.
- Introduced a new API endpoint for nearest articles based on vector search.
- Added confidence badge component to display article confidence levels.
- Implemented tests for article searching, editing, and nearest article API.
- Removed obsolete .htaccess file.
This commit is contained in:
your name
2026-05-13 22:25:45 +02:00
parent c94d3f85e8
commit 9244899f9b
22 changed files with 813 additions and 123 deletions

View File

@@ -9,10 +9,29 @@ use Illuminate\Support\Facades\DB;
class AdminArticleService
{
public function paginate(int $perPage = 10): LengthAwarePaginator
public function paginate(int $perPage = 10, ?string $search = null): LengthAwarePaginator
{
$search = $search !== null ? trim($search) : '';
$numericSearch = ltrim($search, '#');
return Article::query()
->with('quickReplies')
->when($search !== '', function ($query) use ($numericSearch, $search): void {
$like = "%{$search}%";
$query->where(function ($query) use ($numericSearch, $like): void {
$query
->where('title', 'ilike', $like)
->orWhere('content', 'ilike', $like)
->orWhere('source_url', 'ilike', $like)
->orWhere('source_article_id', 'ilike', $like);
if (ctype_digit($numericSearch)) {
$query->orWhere('id', (int) $numericSearch);
}
});
})
->latest()
->paginate($perPage);
}
@@ -34,6 +53,25 @@ class AdminArticleService
return (bool) Article::query()->whereKey($articleId)->delete();
}
public function findById(int $articleId): ?Article
{
return Article::query()->find($articleId);
}
public function updateContent(int $articleId, string $title, string $content): bool
{
$article = Article::query()->find($articleId);
if ($article === null) {
return false;
}
$article->title = trim($title);
$article->content = trim($content);
$article->save();
return true;
}
public function updateMetadata(int $articleId, ?string $note, array $allowedActions, array $quickReplyIds = []): bool
{
$article = Article::query()->find($articleId);