feat(ai): implement AI models management and configuration in admin panel
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import { Public } from '../auth/decorators/public.decorator';
|
||||
import { AI_CATEGORIZATION_MODEL } from './ai.service';
|
||||
import { RECEIPT_IMPORT_MODEL } from '../receipt-import/receipt-import.service';
|
||||
|
||||
export interface AiModelInfo {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
model: string;
|
||||
path: string;
|
||||
trigger: string;
|
||||
access: string;
|
||||
}
|
||||
|
||||
@Controller('ai')
|
||||
export class AiController {
|
||||
@Get('models')
|
||||
@Public()
|
||||
getModels(): AiModelInfo[] {
|
||||
return [
|
||||
{
|
||||
id: 'receipt-pdf',
|
||||
name: 'Kvittoimport — PDF-tolkning',
|
||||
description: 'Extraherar varunamn, mängd och pris ur PDF-kvitton via textanalys.',
|
||||
model: RECEIPT_IMPORT_MODEL,
|
||||
path: '/import',
|
||||
trigger: 'Vid uppladdning av PDF-kvitto',
|
||||
access: 'Alla inloggade',
|
||||
},
|
||||
{
|
||||
id: 'receipt-image',
|
||||
name: 'Kvittoimport — Bildtolkning',
|
||||
description: 'Extraherar varunamn, mängd och pris ur kvittofoton via bildanalys.',
|
||||
model: RECEIPT_IMPORT_MODEL,
|
||||
path: '/import',
|
||||
trigger: 'Vid uppladdning av kvittobild (JPEG, PNG, WebP, HEIC)',
|
||||
access: 'Alla inloggade',
|
||||
},
|
||||
{
|
||||
id: 'receipt-category',
|
||||
name: 'Kvittoimport — Kategorisuggestion',
|
||||
description: 'För varor som inte matchas mot befintliga produkter visas ett AI-förslag på kategori som ledtråd.',
|
||||
model: AI_CATEGORIZATION_MODEL,
|
||||
path: '/import',
|
||||
trigger: 'Automatiskt efter kvittotolkning (om inga träffar hittas)',
|
||||
access: 'Premium-användare + Admin',
|
||||
},
|
||||
{
|
||||
id: 'product-suggest',
|
||||
name: 'AI-kategorisering per produkt',
|
||||
description: 'Ger ett AI-förslag på kategori för en enskild produkt med säkerhetsindikation (hög/medel/låg).',
|
||||
model: AI_CATEGORIZATION_MODEL,
|
||||
path: '/admin/products',
|
||||
trigger: 'Manuell — klick på "✨ Fråga AI" i produktlistan',
|
||||
access: 'Admin',
|
||||
},
|
||||
{
|
||||
id: 'product-bulk',
|
||||
name: 'AI-bulk-kategorisering',
|
||||
description: 'Analyserar alla okategoriserade produkter och presenterar förslag i ett bekräftelsemodal.',
|
||||
model: AI_CATEGORIZATION_MODEL,
|
||||
path: '/admin/products',
|
||||
trigger: 'Manuell — knappen "✨ AI-kategorisera okategoriserade"',
|
||||
access: 'Admin',
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { AiService } from './ai.service';
|
||||
import { AiController } from './ai.controller';
|
||||
|
||||
@Module({
|
||||
controllers: [AiController],
|
||||
providers: [AiService],
|
||||
exports: [AiService],
|
||||
})
|
||||
|
||||
@@ -2,7 +2,8 @@ import { Injectable, Logger, ServiceUnavailableException } from '@nestjs/common'
|
||||
import { FlatCategory } from '../categories/categories.service';
|
||||
|
||||
const MISTRAL_API_URL = 'https://api.mistral.ai/v1/chat/completions';
|
||||
const MODEL = 'mistral-small-2603';
|
||||
export const AI_CATEGORIZATION_MODEL = 'mistral-small-2603';
|
||||
const MODEL = AI_CATEGORIZATION_MODEL;
|
||||
|
||||
export type CategorySuggestion = {
|
||||
categoryId: number;
|
||||
|
||||
Reference in New Issue
Block a user