Skip to content
OrtmannConsulting
Back to all projects

Service desk IT, building materials

AI error diagnosis for a contact centre — explain once, not a thousand times

Telephony logs are collected centrally from every workstation, parsed, and explained by a language model. The bill scales with the number of distinct problems, not with volume.

Year
2026
Services
Artificial intelligence · Communications
Area
Contact centre
Role
In-house, employed

Delivered in an employed role for an internal department, not under an external consulting contract. The organisation is not named.

1×AI analysis per error signaturerather than once per incident
60 daysQueryable historypreviously 7 days, local to each machine
227Tests, all passing

The situation

Contact centre staff work with telephony software running on their own workstation. When something goes wrong there — calls drop, the connection goes stale, the headset stops responding — it is recorded only in log files on that one PC. And the application keeps just seven days locally.

A way to pull logs one at a time already existed: queue a request per person, wait, download a zip archive, read it by hand. Two things were missing — a way to collect across all workstations rather than one by one, and any parsing that turned those archives into data you could query.

The approach

Collect. A scheduled function identifies recently active staff and places a request for each into the queue that already existed. The workstation application answers with an archive — deliberately without changing the application itself.

Parse. A purpose-built Python package unpacks the archive, reassembles multi-line error blocks and stack traces into single records, classifies known patterns into categories using rules, reconstructs individual calls from them, and deduplicates per day. A redaction stage then replaces phone numbers, contact names, Windows usernames and access tokens logged in clear text with typed placeholders.

The ordering is the point: classify first, redact second. Error detection works on the original text; the language model never sees it.

Enrich. A workstation only knows its own view. In parallel the system pulls server-side data — voice quality, platform alerts, queue statistics. That makes visible the callers who hung up before ever reaching a person. In a local log those are invisible by definition.

Where it could have gone the other way

It diagnoses problems, not incidents.

The obvious design is to hand every incoming archive containing errors to the language model. That was rejected. Instead each finding is reduced to a signature: category plus a normalised error message with timestamps, identifiers, hex values and all numbers stripped out. Each signature is explained exactly once, the result cached, and linked through a mapping table to every affected archive.

Cost therefore scales with the number of distinct problems rather than with volume. A platform-wide fault costs one analysis, not one per member of staff. As a side effect the genuinely interesting number falls out for free: “affects N people”.

The price is deliberate over-merging. Because numbers are normalised too, Retry 12/60 and Retry 47/60 collapse into one signature. The code comment names this as accepted and tunable — a known imprecision is a different thing from an overlooked one.

The result

Seven days of local, unreadable logs became a central 60-day window in which you can ask which problem is currently affecting how many people. 227 tests pass; the parser core deliberately uses no third-party library at all, which is what lets it run offline against sample data.

Deliberately not built: the system does not intervene. It writes nothing back, opens no tickets, repairs no workstations. And the AI does not detect, it explains — classification and attribution run deterministically on rules, and the model articulates cause and recommendation for a pattern already recognised. A novel fault with no matching rule stays unclassified rather than being plausibly misfiled.

A hard spending ceiling stops diagnosis before the configured monthly limit. After that, new signatures go unexplained — visibly, not silently.

Stack

  • Python
  • Azure Functions
  • PostgreSQL
  • Claude API
  • Twilio APIs
  • Bicep

More projects

Customer service, construction chemicals

2026
114 → 18Widgets in the call flow

From a 114-widget phone menu to a voice assistant

Callers say what they need in their own words instead of tapping through three menu levels. The language model is never allowed to name a destination — it picks from a list, and the phone system dials.

  • TypeScript / Node.js
  • Azure OpenAI
  • Twilio ConversationRelay
  • Azure App Service

Group customer service, construction chemicals

2026
11Countries on one platform

One contact centre for eleven countries — one platform, not eleven islands

Customer service across eleven countries over voice and SMS, with data from SAP, Salesforce and the product system surfaced directly in the agent workspace. Country differences are configuration, not separate installations.

  • Twilio Flex
  • Twilio TaskRouter
  • Twilio Studio
  • SAP

Sales & inside sales, construction chemicals

2026
1 + 3Orchestrator and specialist agents

One orchestrator, three specialist agents for product questions

Instead of one agent with three knowledge sources, a parent agent routes to three specialists — one each for ERP article data, product content and SharePoint documents.

  • Microsoft Copilot Studio
  • Azure AI Search
  • Azure Functions
  • SharePoint

A similar process at your company?

30 minutes, free, no sales pitch. You describe what is costing you time — I tell you honestly whether automation is worth it.