Status: Proof of Concept · Presented: November 5, 2025 · Branch: users/prnag/chat-assistant-dev (repo https://github.com/EG-A-S/egu-partnerportal/tree/users/prnag/chat-assistant-dev) · Ticket: [EGU-2282] Exploring AI Chat Assistant in Zynergy Partners - EG A/S
Author: Pragnya Nagure, Team Nova
Purpose of this page: Document what was built, explain the underlying RAG pattern, and serve as a reference for future chat/AI-assistant implementations in the platform.
Luma is an AI-powered chat assistant embedded in the Zynergy Partners Application that answers questions about work orders and platform features using natural language, in English, Danish, or Swedish. It combines live database queries, indexed documentation, and page-level context to generate grounded answers via Azure OpenAI (GPT-4o) — rather than relying on the model's general knowledge alone.
This was built as a proof of concept to validate the approach; it is not yet production hardened. The goal of this page is to capture both the concept (so teams can apply the same pattern) and the concrete implementation (so this POC can be extended rather than rebuilt from scratch).
For users: instant answers instead of support tickets, natural-language search instead of filters, multilingual, available on every page.
For the business: deflects repetitive support requests, surfaces what users are actually struggling to find, and demonstrates a reusable pattern for adding AI assistance to other parts of the platform.
Retrieval-Augmented Generation is the core pattern behind Luma, and the one worth reusing elsewhere:

This matters because it lets a general-purpose model like GPT-4o answer accurately about private, current data (this user's work orders, this platform's release notes) that it was never trained on.
The three data sources Luma retrieves from:
| Source | What it is | How it's retrieved in this POC |
|---|---|---|
| Live Data | Work order records, scoped by role/permissions | EF Core query against Azure SQL, reusing the existing IWorkOrderApiService |
| Static data | User Manuals, release notes, FAQs | Indexed in Azure AI Search, queried via keyword search |
| Frontend context | Current page/section the user is viewing | Passed from the Blazor client on each request |

Request flow:


Each of these was demoed live on November 5, 2025:
Area | Limitation | Why it matters |
|---|---|---|
| Auth | Chat endpoint has no [Authorize]; UserId is client-supplied, not verified server-side | Role-based data filtering is real, but trusts a client-given ID - needs to read the user from the authenticated token instead. This chatbot implementation was done before the token authentication security implementation between services |
| Search | Only keyword search is active; vector search is implemented but unused | Semantic/vector search would likely improve retrieval quality for natural-language queries |
| Session management | DELETE api/chat/session/{id} is a stub | Sessions can't actually be cleared yet |
| Scalability | Rate limiter & session store are in-memory only | Won't work across multiple app instances; needs a distributed cache (e.g. Redis) before scaling out |
Takeaways for building similar AI features on this platform:
Method | Route | Notes |
|---|---|---|
| POST | api/chat | Main chat endpoint |
| GET | api/chat/status | Enabled flag, limits, supported languages |
| DELETE | api/chat/session/{sessionId} | Stub, not implemented |
| GET | api/chat/ratelimit/{userId} | Remaining requests for a user |
Config sections (in appsettings.Development.json): AzureOpenAI, AzureAISearch, ChatSettings - see repo for full key list.