Private
Public Access
1
0

Add AI categorization with Ollama: settings, auto-classify on sync/import, and manual classify from Transactions

Adds local LLM-based transaction categorization using Ollama:
- Settings UI to configure Ollama URL, model, confidence threshold
- Auto-categorization during bank sync and file import
- Manual "Classify Uncategorized" button on Transactions screen that respects active filters
- Payee default category learning loop for classified transactions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-08 18:41:12 -05:00
parent 57d1051213
commit 1c7abb7ffc
18 changed files with 2423 additions and 3 deletions
@@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Purrse.Core.DTOs;
using Purrse.Core.Interfaces.Services;
using System.Security.Claims;
namespace Purrse.Api.Controllers;
[Authorize]
[ApiController]
[Route("api/ai-categorization")]
public class AiCategorizationController : ControllerBase
{
private readonly IAiCategorizationService _aiService;
private Guid UserId => Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
public AiCategorizationController(IAiCategorizationService aiService) => _aiService = aiService;
[HttpGet("settings")]
public async Task<ActionResult<AiCategorizationSettingsResponse>> GetSettings()
=> Ok(await _aiService.GetSettingsAsync(UserId));
[HttpPut("settings")]
public async Task<ActionResult<AiCategorizationSettingsResponse>> UpdateSettings(UpdateAiCategorizationSettingsRequest request)
=> Ok(await _aiService.UpdateSettingsAsync(UserId, request));
[HttpPost("test-connection")]
public async Task<ActionResult<OllamaConnectionTestResponse>> TestConnection()
=> Ok(await _aiService.TestConnectionAsync(UserId));
[HttpPost("classify")]
public async Task<ActionResult<ClassifyUncategorizedResponse>> ClassifyUncategorized(ClassifyUncategorizedRequest request)
=> Ok(await _aiService.ClassifyUncategorizedAsync(UserId, request));
}