Hermes

AI ticket classification

.NET 10KafkaQdrantBlazor ServerPostgreSQLAzure APIM

Hermes turns a support mailbox into classified tickets. It reads mail over IMAP, POP3, Graph API or EWS, discards in cascade whatever is not a ticket —auto-replies, newsletters, noise—, extracts text from attachments and classifies what remains against the taxonomy each client owns, leaning on retrieval-augmented generation (RAG) over their own documentation in Jira, Confluence, BookStack or the CMDB. It watches SLAs against business calendars and escalates before the breach, not after. And when an operator corrects a classification, that correction goes back into the system: today by re-ranking RAG results, later as model fine-tuning.

What it does

It attacks the work that drains a support team before anything gets solved: reading, discarding, working out what it is about and whose it is.

  • Reads mailboxes over IMAP, POP3, Graph API and EWS through a four-stage filtering cascade.
  • Extracts attachment text with optical recognition so nothing arriving as an image or PDF is lost.
  • Classifies each ticket against the client’s own taxonomy, not a generic list.
  • Retrieves context from Jira, Jira Assets, Confluence, BookStack and REST systems through RAG.
  • Detects duplicates by semantic similarity rather than literal subject matching.
  • Tracks SLAs against business calendars and escalates before they are breached.
  • Notifies over Teams, Slack, email or webhook with a rules engine, throttling and storm protection.
  • Acts on the target ITSM —Jira, ServiceNow, Azure DevOps or webhook— with configurable field mapping.

Architecture

Eight .NET 10 services communicate over Kafka, and tenant isolation is applied across every storage layer, not just the database.

  • Eight decoupled .NET 10 microservices over Apache Kafka: ingestion, classification, knowledge, feedback, tenant, dashboard, notification and action.
  • End-to-end multi-tenancy: row-level security in PostgreSQL, a Qdrant collection per client, AES-256-GCM encryption keys per client and tenant-scoped Redis keys.
  • A RAG pipeline with connectors into the client documentation sources.
  • A feedback loop where operator corrections re-rank RAG immediately and feed a deferred fine-tune with A/B promotion.
  • Model access through Azure API Management.
  • A Blazor Server dashboard reusing the Hefesto design system.

Stack

Eight C# services on .NET 10 communicating over Apache Kafka in KRaft mode, with PostgreSQL 16 for relational data, Qdrant as the vector store for RAG, Redis 7 for cache and ephemeral state, Azure API Management as the gateway to the models and a Blazor Server dashboard.

Back to projects