Powered by Victa
Documentation

Vegoia — User Documentation

Overview

Vegoia lets you ask questions about your organisation's data in plain language. Instead of writing SQL, navigating dashboards or requesting reports from analysts, you simply describe what you want to know.

Unlike general-purpose AI assistants, Vegoia does not rely solely on a language model. It generates SQL, executes it against your data warehouse, analyses the results, and explains its conclusions. Every response includes the reasoning, executed SQL and supporting data, making answers transparent and easy to verify.

Questions can range from straightforward retrieval such as "What was our average delivery delay last month?" to broader investigations like "Which customers are most at risk, and why?" or "Investigate why operating margin declined this quarter." Vegoia automatically chooses the appropriate approach. Precise questions are answered directly, while broader questions trigger a deeper investigation across multiple possible explanations.

Behind this sits two shared knowledge layers. During onboarding, Victa generates the initial physical layer from your database. From then on, your organisation gradually enriches the knowledge through concepts and reviewed proposals as new business knowledge emerges. See Knowledge layers for the full picture.

Transparency: Every response includes the reasoning, the SQL that ran, and the data it ran against. Answers are generated from actual query results, and if a query returns nothing, the answer says so. Unlike AI systems that simply produce an answer, Vegoia always shows how that answer was obtained.

Why Vegoia works differently

Traditional AI assistants try to infer business meaning directly from raw database schemas, while traditional BI systems require analysts to define every metric before users can ask questions.

Vegoia combines both approaches. It automatically understands the physical structure of your data while allowing your organisation to capture business knowledge incrementally through concepts. This means you can start using Vegoia immediately while continuously improving answer quality over time.

Knowledge layers

Vegoia's ability to answer questions depends on two complementary knowledge layers. The physical layer explains how your data is stored, while the concept layer explains what your organisation means. Neither is sufficient on its own; together they allow Vegoia to translate business questions into correct SQL.

Physical layer

Generated by Victa during onboarding, and describes your database. For every table and column it stores:

  • a description of what the table/column means and what a single row represents
  • a column type classification: key, categorical, number, temporal, or freetext
  • for categorical columns, the distinct coded values fetched automatically from the database, plus their business meanings — which start empty and are filled in by your team via the Curation Hub
  • warnings and quirks — column-level warnings flag risks specific to one column; table-level quirks flag things that affect every query against a table (e.g. a table that mixes actuals and forecasts and always needs a record-type filter)
  • join hints — during generation, Vegoia auto-suggests joins by matching column names against other tables. These suggested joins are not yet trusted; a join only becomes confirmed once you verify it via the Curation Hub. This is why the agent sometimes guesses a join, and how you correct it if it guesses wrong.

Filling in enum meanings is usually the first thing worth doing in the Curation Hub — for example, telling Vegoia that ORDER_TYPE = YLS means a cancelled order, or that NET_INVOICE_VALUE is stored as text with comma decimals and needs conversion.

Concept layer

The physical layer describes databases. The concept layer describes your business. Many business definitions do not exist anywhere in the database itself—for example what counts as revenue, when a customer is active, or which orders are considered cancelled. These definitions are stored as reusable concepts.

Also referred to as the business logic layer — the more concrete "concept" name is used going forward, but it's the same layer: built and maintained by your organisation over time, starting empty and growing as your team adds definitions.

What a concept is. A concept is a named, reusable business definition with:

  • a short description and a longer description
  • a section and topic it belongs to (for organisation and retrieval)
  • a structure describing its parameters, filters, grain, and formula — and which parts of that structure are fixed versus variable from question to question
  • an optional verified example query (may be empty if not yet probed against real data)
  • search terms — the words a user would naturally type when asking about it, including synonyms and abbreviations, so Vegoia can match future questions to it automatically

Concepts are one unified shape — there is no longer a taxonomy of concept types (metric, filter rule, derived column, etc.). Every concept is described the same way.

What makes a concept good:

  • its formula or filters are verified against real data — probed with actual SQL against the physical layer — rather than guessed
  • its description is precise enough that the agent can derive correct SQL from the text alone, without needing to re-ask you
  • its search terms are distinct from other concepts' search terms, so retrieval doesn't confuse one concept for another

Most people never need the Curation Hub below. It is primarily intended for administrators responsible for maintaining the shared knowledge layers.

Curation Hub

The Curation Hub replaces the old chat commands (/sections, /concept, /update, /review), documented in Appendix: legacy chat commands below for reference. It's an admin panel for organising, correcting, and building the knowledge layers.

Opening it. Ask Vegoia a question first. The Curation Hub icon (a star) sits in the toolbar under the assistant's response, so you need at least one response before you can open it.

The hub groups into concept-layer tabs (Concepts, Proposals, Sections) and physical-layer tabs (Ambiguities, Browse), plus a combined Home worklist.

TabRolePurpose
HomeadminWorklist: pending proposals, physical-layer columns needing attention, concept feedback
ConceptsadminDraft, refine, and save concepts; browse existing ones by section and topic
ProposalsadminReview concept proposals raised from user feedback; accept or discard
Sectionsadmin to generate/edit, all roles to viewGenerate and refine the section taxonomy that groups concepts
AmbiguitiesadminCorrect physical-layer columns with unclear or ambiguous classification
Browseall rolesRead-only: browse schemas, tables, and columns

Draft, refine, save. Every edit follows the same loop. Describe what you want, or pick something to refine. Vegoia proposes a draft. Refine it with more guidance as many times as you like. Nothing is written until you explicitly save it as live, save it as a proposal, apply it, or accept/discard. A draft banner and a before/after diff show exactly what would change before you commit.

Working with Vegoia

Most organisations begin using Vegoia immediately after deployment. Victa generates the initial physical layer during onboarding, after which users simply start asking questions. As new business knowledge emerges, Vegoia proposes improvements which administrators can review and accept. The knowledge base therefore evolves naturally during day-to-day use.

API access

Vegoia exposes an OpenAI-compatible HTTP API. Beyond the chat interface, you can call it directly from scripts, scheduled jobs, or other tools — useful for automation, proactive reporting, or embedding Vegoia into a wider workflow.

When to use the API. The chat interface is the easiest way to explore your data interactively. The API is better suited when you want to automate recurring questions (e.g. a daily summary pushed to a dashboard or Slack), run Vegoia queries from a notebook or pipeline, or build tooling on top of Vegoia responses.

Request

Send a POST to /chat/completions. The schema follows the OpenAI Chat Completions format with two additional fields:

{
  "model":           "spot",
  "messages": [
    { "role": "user", "content": "What was total revenue last month?" }
  ],
  "conversation_id": "session-abc",      // optional — ties requests to a backend session
  "message_id":      "msg-xyz"           // optional — enables payload retrieval
}
FieldDescription
modelUse spot. Thinking-mode selection (retrieval or brainstorm) is fully automatic — there is no mode selector.
messagesFull conversation history. The last user message is the current query; earlier messages provide context.
conversation_idOptional. Ties requests to a backend session. If omitted, a new session is created automatically. Use the same ID across turns to continue a conversation.
message_idOptional. A unique ID you assign to this message. When provided, the full response payload is stored under this ID and retrievable afterwards.

Python example

import requests

BASE_URL = "https://<your-vegoia-url>"
API_KEY  = "<your-api-key>"

response = requests.post(
    f"{BASE_URL}/chat/completions",
    headers={"Datalk-API-key": API_KEY},
    json={
        "model":      "spot",
        "messages":   [{"role": "user", "content": "What was total revenue last month?"}],
        "message_id": "msg-001",    # store payload for retrieval
    }
)

answer = response.json()["choices"][0]["message"]["content"]
print(answer)

Response

The response follows the standard OpenAI format. The assistant's answer is in choices[0].message.content. Send the next message with the same conversation_id to continue a multi-turn conversation.

{
  "id":      "chatcmpl-...",
  "object":  "chat.completion",
  "model":   "spot",
  "choices": [{
    "index": 0,
    "message": {
      "role":    "assistant",
      "content": "Total revenue last month was €4.2M across 11,284 invoices."
    },
    "finish_reason": "stop"
  }]
}

Payload retrieval

If you passed a message_id, you can retrieve the full reasoning trace and supporting detail after the response completes:

payload = requests.get(
    f"{BASE_URL}/chat/{message_id}/payload",
    headers={"Datalk-API-key": API_KEY},
).json()

# payload contains:
# reasoning         — how the agent interpreted the question
# queries_path      — list of SQL queries that ran
# latency_ms        — total response time in milliseconds
# tokens            — { input, output, total }
# timing            — per-stage timing breakdown
# matched_concepts  — concepts the router matched to this question

Payloads are stored only for final answers. API keys are issued by Victa separately from Open WebUI accounts.

Submitting feedback-driven proposals

POST /chat/{message_id}/propose exists for submitting a concept proposal generated from feedback on a specific answer. Most integrations won't need to call this directly — it backs the "propose" action button in Open WebUI — but it's available if you're building your own feedback flow on top of the API.

Accounts & API keys

Open WebUI accounts

The Vegoia interface runs on Open WebUI. Every person who uses Vegoia needs their own account: an email address and password combination.

Do not share accounts. Sessions in Open WebUI are tied to a user. If two people use the same login simultaneously, sessions will interfere and conversations will mix unpredictably.

New users can self-register and land in a Pending state, where they cannot use the front end until an admin promotes them. The first user to log in becomes admin automatically. Once your organisation's admin account has been handed over by Victa, your own on-site admin can also create and promote users directly — you don't have to request every account from Victa.

API keys and database access

Behind the scenes, each Open WebUI connection is backed by an API key configured by Victa. This key defines:

  • Database connection — which database Vegoia queries and with which credentials. Your organisation provides these credentials and is responsible for what data is accessible through them.
  • Semantic model — which physical layer and concept layer is active for this connection. Different API keys can use different configurations, for example per role or per team.

The model in Open WebUI is spot. Thinking-mode selection (retrieval or brainstorm) is determined automatically by Vegoia based on your question — you don't select it.

API key roles

Each API key has a role that determines Curation Hub access:

  • Viewer (default) — can query data, read stored concepts, and browse the physical layer read-only in the Curation Hub.
  • Admin (write access) — full access: drafting and saving concepts, resolving proposals, generating sections, and correcting the physical layer.

The role is set on the API key by Victa. If you need write access to maintain concepts and descriptions, ask Victa to set your key to admin.

Getting started

  1. Create your Open WebUI account — either self-register (you'll start Pending until an admin promotes you) or have an admin (Victa, or your own on-site admin after handover) create it for you.
  2. Log in at your organisation's Vegoia URL.
  3. The database connection is pre-configured — no setup needed on your end.
  4. Select spot and ask your first question.

Data & security

Data scope

Vegoia only queries the database configured for your organisation. It has no access to:

  • Other organisations' data. Each client runs in a fully isolated environment with separate containers and dedicated infrastructure. There is no shared data between organisations.
  • The internet. Vegoia does not search the web or retrieve external information. All answers are derived from your database together with the physical and concept layers. Vegoia does not invent missing information; if the required information is unavailable, it says so.

Your organisation's responsibility

Your organisation controls which database credentials are provided to Vegoia, and therefore what data is reachable. Data access is determined entirely by the permissions on those credentials — this is managed at the database level, not within Vegoia. There is no automatic filtering of sensitive data: the physical layer is a knowledge layer, not an access-control layer. The agent works from what it knows, but if a user explicitly names a table or column, the agent can query it even if it's not described in the model, as long as the database credentials permit it. If certain data should not be reachable through Vegoia, restrict it at the database role level.

API access control

The API endpoint is publicly reachable over the internet; the API key is the primary access control. Treat your API key as confidential — anyone holding it can query whatever your organisation's configured database credentials expose.

Infrastructure and hosting

All components run within Victa's Azure environment. Per client, a separate resource group is provisioned with isolated containers and access via private endpoints. The environment is not publicly accessible beyond the configured ingress.

  • Hosted in Europe. All infrastructure runs on Microsoft Azure in European regions. Language model requests are processed via Azure OpenAI hosted in Sweden Central. Data does not leave the European region. Using a centrally managed Vegoia instance also avoids employees uploading business data into public AI tools. Everyone works from the same governed data source and shared business definitions.
  • Encrypted in transit. All connections between components use encrypted channels. API keys and database credentials are encrypted at rest using AES-256 and stored in Azure Key Vault.
  • Authentication. Access to the management platform (Control Plane) requires Microsoft authentication. User access to the Vegoia interface is managed per account by Victa admins.
  • No persistent data storage. The backend processes data in memory and does not store query results after the response is delivered. If the frontend is used, chat history is stored per user within the Azure environment until deleted.

Support access

Victa keeps a guest admin account in your organisation's Entra tenant for support access. This account is removed at offboarding — when the Victa team member leaves, or the engagement ends.

Division of responsibilities

  • Your organisation is responsible for: the data made available, access permissions, compliance with applicable laws and contracts, and the decision to use the frontend and accept chat history storage.
  • Victa is responsible for: secure hosting, infrastructure management, isolation between clients, and operational logging and monitoring.

If you need access to a new dataset or schema, contact Victa to have it added to the semantic model.

Appendix: legacy chat commands (removed)

These commands no longer work. They're kept here for reference; use the Curation Hub instead.

Four commands used to let you organise, update, and build the knowledge layers directly from chat. Commands bypassed the normal question pipeline entirely and went straight to the layer-editing flow.

How these were used, in order:

  1. Run /sections generate once, before creating any concepts. Sections had to exist first.
  2. Create concepts with /concept and correct the physical layer with /update, in either order, as often as needed.
  3. Use /review periodically to check what's left to fill in.

/sections — admin, except show

Organised concepts into named sections (e.g. "Sales Performance", "Financial Planning") so the concept library stayed readable as it grew, and so retrieval could narrow down which concepts were relevant before reading them.

SyntaxRolePurpose
/sections generateadminPropose a section taxonomy from the physical layer. Run once, before any concepts exist.
/sections okadminAccept and store the staged proposal.
/sections stopadminCancel the staged proposal.
/sections <guidance>adminRefine the staged proposal.
/sections showall rolesDisplay the current sections.
/sections update <name> <guidance>adminRefine one existing section.

/concept — admin, except all and <tag>

Proposed, inspected, and managed concepts (business definitions) stored in the concept layer.

SyntaxRolePurpose
/concept <description>adminPropose a new concept from a plain-language description (optionally including SQL).
/concept okadminAccept and store the staged proposal.
/concept stopadminCancel the staged proposal.
/concept <guidance>adminRefine the staged proposal.
/concept allall rolesList all stored concepts, grouped by section and topic.
/concept <tag>all rolesShow a single stored concept by its tag.
/concept <tag> deleteadminDelete a stored concept.
/concept update <tag> <guidance>adminUpdate an existing concept.

Proposals from feedback. When a user's feedback on an answer suggested a new or changed concept, Vegoia staged it as a proposal rather than creating a /concept call directly:

SyntaxRolePurpose
/concept proposaladminList all pending proposals.
/concept proposal <tag>adminShow a single pending proposal.
/concept proposal <tag> okadminAccept the proposal, making it a live concept.
/concept proposal <tag> stopadminDiscard the proposal.
/concept proposal <tag> <guidance>adminRefine the proposal and re-stage it.

Analytics. /concept analyze (admin) showed feedback stats for all concepts, so you could see which ones were performing well or badly.

/update — admin, except show

Proposed corrections to how your data was described in the physical layer. Changes were written to a sandbox copy — nothing was applied until you confirmed.

SyntaxRolePurpose
/update <description>adminPropose a physical-layer correction from a plain-language description.
/update okadminApply the staged proposal.
/update stopadminCancel the staged proposal.
/update <guidance>adminRefine the staged proposal — the agent re-ran with your original description plus the new guidance, so context wasn't lost across turns.
/update showall rolesList all columns resolved via /update.

/review — all roles

Listed physical-layer columns that still needed attention.

SyntaxRolePurpose
/reviewall rolesList columns needing attention (ambiguous or unclear classification).
/review allall rolesAlso include categorical columns that have coded values with no meaning filled in yet.

Vegoia — Gebruikersdocumentatie

Overzicht

Vegoia laat je in gewone taal vragen stellen over de data van jouw organisatie. In plaats van SQL te schrijven, dashboards door te klikken of rapportages op te vragen bij analisten, beschrijf je simpelweg wat je wilt weten.

In tegenstelling tot algemene AI-assistenten vertrouwt Vegoia niet alleen op een taalmodel. Het genereert SQL, voert deze uit op jouw datawarehouse, analyseert de resultaten en legt de conclusies uit. Elk antwoord bevat de redenering, de uitgevoerde SQL en de onderliggende data, waardoor antwoorden transparant en eenvoudig te verifiëren zijn.

Vragen kunnen variëren van een directe retrieval, zoals "Wat was onze gemiddelde leveringsvertraging vorige maand?", tot bredere onderzoeken zoals "Welke klanten lopen het meeste risico, en waarom?" of "Onderzoek waarom de operationele marge dit kwartaal is gedaald." Vegoia kiest automatisch de juiste aanpak. Precieze vragen worden direct beantwoord, terwijl bredere vragen een dieper onderzoek starten langs meerdere mogelijke verklaringen.

Hieronder liggen twee gedeelde kennislagen. Tijdens de onboarding genereert Victa de eerste fysieke laag uit jouw database. Daarna verrijkt jouw organisatie de kennis geleidelijk met concepten en beoordeelde voorstellen naarmate nieuwe bedrijfskennis ontstaat. Zie Kennislagen voor het volledige beeld.

Transparantie: Elk antwoord bevat de redenering, de uitgevoerde SQL en de data waartegen die is uitgevoerd. Antwoorden worden gegenereerd op basis van echte queryresultaten, en als een query niets teruggeeft, vermeldt het antwoord dat. In tegenstelling tot AI-systemen die simpelweg een antwoord produceren, laat Vegoia altijd zien hoe dat antwoord tot stand is gekomen.

Waarom Vegoia anders werkt

Traditionele AI-assistenten proberen bedrijfsbetekenis direct af te leiden uit ruwe databaseschema's, terwijl traditionele BI-systemen vereisen dat analisten elke metriek vooraf definiëren voordat gebruikers vragen kunnen stellen.

Vegoia combineert beide benaderingen. Het begrijpt automatisch de fysieke structuur van jouw data, terwijl het jouw organisatie de mogelijkheid geeft om bedrijfskennis stapsgewijs vast te leggen via concepten. Hierdoor kun je direct met Vegoia aan de slag, terwijl de kwaliteit van de antwoorden continu verbetert.

Kennislagen

Vegoia kan vragen beantwoorden dankzij twee complementaire kennislagen. De fysieke laag beschrijft hoe data is opgeslagen; de conceptlaag beschrijft wat jouw organisatie daarmee bedoelt. Samen vormen ze de basis voor correcte SQL en consistente antwoorden.

Fysieke laag

Gegenereerd door Victa tijdens onboarding, en beschrijft jouw database. Voor elke tabel en kolom slaat het op:

  • een beschrijving van wat de tabel/kolom betekent en wat een enkele rij vertegenwoordigt
  • een kolomtypeclassificatie: sleutel, categorisch, getal, temporeel of vrije tekst
  • voor categorische kolommen, de gecodeerde waarden die automatisch uit de database worden opgehaald, plus hun zakelijke betekenissen — die starten leeg en worden door jouw team ingevuld via de Curation Hub
  • waarschuwingen en quirks — waarschuwingen op kolomniveau markeren risico's specifiek voor één kolom; quirks op tabelniveau markeren dingen die elke query tegen een tabel beïnvloeden (bijv. een tabel die actuals en prognoses combineert en altijd een recordtype filter nodig heeft)
  • joinhints — tijdens generatie stelt Vegoia automatisch joins voor door kolomnamen te matchen tegen andere tabellen. Deze voorgestelde joins zijn nog niet vertrouwd; een join wordt pas bevestigd zodra je die verifieert via de Curation Hub. Dit is waarom de agent soms een join gokt, en hoe je dat corrigeert als hij het mis heeft.

De betekenissen van enum-waarden invullen is meestal het eerste dat het waard is om te doen in de Curation Hub — bijvoorbeeld Vegoia vertellen dat ORDER_TYPE = YLS een geannuleerde order betekent, of dat NET_INVOICE_VALUE is opgeslagen als tekst met komma decimalen en conversie vereist.

Conceptlaag

De fysieke laag beschrijft de database. De conceptlaag beschrijft jouw organisatie. Veel definities bestaan niet in de database zelf, zoals wat onder omzet, een actieve klant of een geannuleerde order wordt verstaan. Die kennis wordt vastgelegd als herbruikbare concepten.

Ook wel de bedrijfslogicalaag genoemd — de meer concrete naam "concept" wordt vanaf nu gebruikt, maar het is dezelfde laag: opgebouwd en onderhouden door jouw organisatie in de loop van de tijd, start leeg en groeit naarmate jouw team definities toevoegt.

Wat een concept is. Een concept is een benoemde, herbruikbare bedrijfsdefinitie met:

  • een korte beschrijving en een langere beschrijving
  • een sectie en topic waartoe het behoort (voor organisatie en retrieval)
  • een structuur die zijn parameters, filters, grain en formule beschrijft — en welke delen van die structuur vast zijn versus variabel van vraag tot vraag
  • een optionele geverifieerde voorbeeldquery (kan leeg zijn als deze nog niet tegen echte data is getoetst)
  • zoektermen — de woorden die een gebruiker op een natuurlijke manier zou typen als hij ernaar vraagt, inclusief synoniemen en afkortingen, zodat Vegoia toekomstige vragen er automatisch aan kan koppelen

Concepten hebben één uniforme vorm — er is geen taxonomie van concepttypen meer (metriek, filterregel, afgeleide kolom, enz.). Elk concept wordt op dezelfde manier beschreven.

Wat een concept goed maakt:

  • zijn formule of filters zijn geverifieerd tegen echte data — getoetst met daadwerkelijke SQL tegen de fysieke laag — in plaats van gegokt
  • zijn beschrijving is precies genoeg dat de agent correcte SQL kan afleiden uit de tekst alleen, zonder je opnieuw te moeten vragen
  • zijn zoektermen zijn onderscheidend van de zoektermen van andere concepten, zodat retrieval het ene concept niet met het andere verwart

De Curation Hub hieronder is meestal niet nodig voor gewone gebruikers. Deze is vooral bedoeld voor beheerders die de gedeelde kennislagen onderhouden.

Curation Hub

De Curation Hub vervangt de oude chatcommando's (/sections, /concept, /update, /review), gedocumenteerd in Appendix: oude chatcommando's hieronder ter referentie. Het is een beheerpaneel om de kennislagen te organiseren, corrigeren en opbouwen.

Openen. Stel Vegoia eerst een vraag. Het Curation Hub icoon (een ster) staat in de werkbalk onder het antwoord van de assistent, dus je hebt minstens één antwoord nodig voordat je de hub kunt openen.

De hub is opgedeeld in conceptlaag-tabs (Concepten, Voorstellen, Secties) en fysieke-laag-tabs (Dubbelzinnigheden, Bladeren), plus een gecombineerde Home-werklijst.

TabRolDoel
HomeadminWerklijst: openstaande voorstellen, fysieke-laag-kolommen die aandacht nodig hebben, conceptfeedback
ConceptenadminConcepten opstellen, verfijnen en opslaan; bestaande concepten doorbladeren per sectie en topic
VoorstellenadminConceptvoorstellen uit gebruikersfeedback beoordelen; accepteren of verwerpen
Sectiesadmin voor genereren/bewerken, alle rollen voor bekijkenDe sectietaxonomie die concepten groepeert genereren en verfijnen
DubbelzinnighedenadminFysieke-laag-kolommen met onduidelijke of dubbelzinnige classificatie corrigeren
Bladerenalle rollenAlleen-lezen: schema's, tabellen en kolommen doorbladeren

Opstellen, verfijnen, opslaan. Elke wijziging volgt dezelfde stappen. Beschrijf wat je wilt, of kies iets om te verfijnen. Vegoia stelt een concept-versie voor. Verfijn deze zo vaak als nodig met extra instructies. Niets wordt opgeslagen totdat je het expliciet opslaat als actief, opslaat als voorstel, toepast, of accepteert/verwerpt. Een concept-banner en een voor/na-diff tonen precies wat er zou veranderen voordat je het bevestigt.

Werken met Vegoia

De meeste organisaties kunnen Vegoia direct na de uitrol gebruiken. Victa genereert tijdens de onboarding de eerste fysieke laag. Daarna stellen gebruikers simpelweg vragen. Wanneer nieuwe bedrijfskennis nodig blijkt, doet Vegoia voorstellen die een beheerder kan beoordelen. Zo groeit de kennis mee met dagelijks gebruik.

API-toegang

Vegoia biedt een OpenAI-compatibele HTTP API. Naast de chatinterface kun je deze ook rechtstreeks aanroepen vanuit scripts, geplande taken of andere tools — handig voor automatisering, proactieve rapportage, of het inbedden van Vegoia in een bredere workflow.

Wanneer gebruik je de API. De chatinterface is het makkelijkst voor interactief verkennen van je data. De API is beter geschikt als je terugkerende vragen wilt automatiseren (bijv. een dagelijkse samenvatting naar een dashboard of Slack), Vegoia-queries wilt uitvoeren vanuit een notebook of pipeline, of tooling wilt bouwen bovenop Vegoia-antwoorden.

Request

Stuur een POST naar /chat/completions. Het schema volgt het OpenAI Chat Completions-formaat met twee extra velden:

{
  "model":           "spot",
  "messages": [
    { "role": "user", "content": "Wat was de totale omzet vorige maand?" }
  ],
  "conversation_id": "sessie-abc",       // optioneel — koppelt verzoeken aan een backendsessie
  "message_id":      "bericht-xyz"       // optioneel — maakt payload-ophaling mogelijk
}
VeldBeschrijving
modelGebruik spot. De keuze van denkmodus (retrieval of brainstorm) is volledig automatisch — er is geen modusselector.
messagesVolledige gespreksgeschiedenis. Het laatste user-bericht is de huidige query; eerdere berichten bieden context.
conversation_idOptioneel. Koppelt verzoeken aan een backendsessie. Als weggelaten, wordt automatisch een nieuwe sessie aangemaakt. Gebruik hetzelfde ID over beurten heen om een gesprek voort te zetten.
message_idOptioneel. Een uniek ID dat jij aan dit bericht toekent. Als opgegeven, wordt de volledige antwoordpayload opgeslagen onder dit ID en later opvraagbaar.

Python-voorbeeld

import requests

BASE_URL = "https://<jouw-vegoia-url>"
API_KEY  = "<jouw-api-sleutel>"

response = requests.post(
    f"{BASE_URL}/chat/completions",
    headers={"Datalk-API-key": API_KEY},
    json={
        "model":      "spot",
        "messages":   [{"role": "user", "content": "Wat was de totale omzet vorige maand?"}],
        "message_id": "bericht-001",    # sla payload op voor ophaling
    }
)

antwoord = response.json()["choices"][0]["message"]["content"]
print(antwoord)

Response

De response volgt het standaard OpenAI-formaat. Het antwoord van de assistent staat in choices[0].message.content. Stuur het volgende bericht met hetzelfde conversation_id om een gesprek met meerdere beurten voort te zetten.

{
  "id":      "chatcmpl-...",
  "object":  "chat.completion",
  "model":   "spot",
  "choices": [{
    "index": 0,
    "message": {
      "role":    "assistant",
      "content": "De totale omzet vorige maand was €4,2M over 11.284 facturen."
    },
    "finish_reason": "stop"
  }]
}

Payload ophalen

Als je een message_id hebt meegegeven, kun je na afronding de volledige redenering en ondersteunende details ophalen:

payload = requests.get(
    f"{BASE_URL}/chat/{message_id}/payload",
    headers={"Datalk-API-key": API_KEY},
).json()

# payload bevat:
# reasoning         — hoe de agent de vraag heeft geïnterpreteerd
# queries_path      — lijst van uitgevoerde SQL-queries
# latency_ms        — totale responstijd in milliseconden
# tokens            — { input, output, total }
# timing            — tijdsverdeling per fase
# matched_concepts  — concepten die de router aan deze vraag heeft gekoppeld

Payloads worden alleen opgeslagen voor definitieve antwoorden. API sleutels worden door Victa apart uitgegeven, los van Open WebUI accounts.

Feedback-gedreven voorstellen indienen

POST /chat/{message_id}/propose bestaat om een conceptvoorstel in te dienen dat is gegenereerd op basis van feedback op een specifiek antwoord. De meeste integraties hoeven dit niet rechtstreeks aan te roepen — het ondersteunt de "voorstellen"-actieknop in Open WebUI — maar is beschikbaar als je jouw eigen feedbackstroom bovenop de API bouwt.

Accounts & API sleutels

Open WebUI accounts

De Vegoia interface draait op Open WebUI. Iedereen die Vegoia gebruikt heeft een eigen account nodig: een combinatie van e-mailadres en wachtwoord.

Accounts niet delen. Sessies in Open WebUI zijn gekoppeld aan een gebruiker. Als twee mensen tegelijkertijd dezelfde login gebruiken, verstoren sessies elkaar en gesprekken mengen onvoorspelbaar.

Nieuwe gebruikers kunnen zichzelf registreren en komen dan in een Pending-status terecht, waarbij ze de front end niet kunnen gebruiken totdat een admin ze promoveert. De eerste gebruiker die inlogt wordt automatisch admin. Zodra het adminaccount van jouw organisatie door Victa is overgedragen, kan jouw eigen on-site admin ook direct gebruikers aanmaken en promoveren — je hoeft niet elk account bij Victa aan te vragen.

API sleutels en databasetoegang

Achter de schermen wordt elke Open WebUI verbinding ondersteund door een API sleutel geconfigureerd door Victa. Deze sleutel definieert:

  • Databaseverbinding — welke database Vegoia bevraagt en met welke inloggegevens. Jouw organisatie levert deze inloggegevens en is verantwoordelijk voor welke data er via toegankelijk is.
  • Semantisch model — welke fysieke laag en conceptlaag actief is voor deze verbinding. Verschillende API sleutels kunnen verschillende configuraties gebruiken, bijv. per rol of per team.

Het model in Open WebUI is spot. De keuze van denkmodus (retrieval of brainstorm) wordt automatisch door Vegoia bepaald op basis van jouw vraag — je selecteert deze niet zelf.

API sleutel rollen

Elke API sleutel heeft een rol die de toegang tot de Curation Hub bepaalt:

  • Viewer (standaard) — kan data bevragen, opgeslagen concepten inzien en de fysieke laag alleen-lezen doorbladeren in de Curation Hub.
  • Admin (schrijftoegang) — volledige toegang: concepten opstellen en opslaan, voorstellen beoordelen, secties genereren en de fysieke laag corrigeren.

De rol wordt ingesteld op de API sleutel door Victa. Als je schrijftoegang nodig hebt om concepten en beschrijvingen te beheren, vraag dan aan Victa om jouw sleutel op admin in te stellen.

Aan de slag

  1. Maak jouw Open WebUI account aan — registreer jezelf (je start Pending totdat een admin je promoveert) of laat een admin (Victa, of jouw eigen on-site admin na overdracht) het account voor je aanmaken.
  2. Log in via de Vegoia URL van jouw organisatie.
  3. De databaseverbinding is vooraf geconfigureerd — geen instelling vereist van jouw kant.
  4. Selecteer spot en stel jouw eerste vraag.

Data & beveiliging

Gegevensbereik

Vegoia bevraagt alleen de database geconfigureerd voor jouw organisatie. Het heeft geen toegang tot:

  • Data van andere organisaties. Elke klant draait in een volledig geïsoleerde omgeving met aparte containers en dedicated infrastructuur. Er is geen gedeelde data tussen organisaties.
  • Het internet. Vegoia zoekt niet op internet of haalt geen externe informatie op. Alle antwoorden zijn afgeleid van jouw database, samen met de fysieke laag en de conceptlaag. Vegoia verzint geen ontbrekende informatie; als de benodigde informatie niet beschikbaar is, meldt het antwoord dat.

Verantwoordelijkheid van jouw organisatie

Jouw organisatie bepaalt welke databasereferenties aan Vegoia worden verstrekt, en daarmee welke data bereikbaar is. Datatoegang wordt volledig bepaald door de rechten op die referenties — dit wordt beheerd op databaseniveau, niet binnen Vegoia. Er is geen automatische filtering van gevoelige data: de fysieke laag is een kennislaag, geen toegangsbeheerslaag. De agent werkt vanuit wat hij kent, maar als een gebruiker expliciet een tabel of kolom noemt, kan de agent die alsnog bevragen ook al is deze niet beschreven in het model, zolang de databasereferenties dat toestaan. Als bepaalde data niet toegankelijk moet zijn via Vegoia, beperk dit dan op het niveau van de databaserol.

API-toegangscontrole

Het API endpoint is publiek bereikbaar via internet; de API sleutel is de primaire toegangscontrole. Behandel jouw API sleutel als vertrouwelijk — iedereen die deze bezit kan alles bevragen wat de geconfigureerde databasereferenties van jouw organisatie blootstellen.

Infrastructuur en hosting

Alle componenten draaien binnen de Azure omgeving van Victa. Per klant wordt een aparte resourcegroep ingericht met geïsoleerde containers en toegang via private endpoints. De omgeving is niet publiek toegankelijk buiten de geconfigureerde ingress.

  • Gehost in Europa. Alle infrastructuur draait op Microsoft Azure in Europese regio's. Taalmodelverzoeken worden verwerkt via Azure OpenAI gehost in Sweden Central. Data verlaat de Europese regio niet. Het gebruik van een centraal beheerde Vegoia-omgeving voorkomt bovendien dat medewerkers bedrijfsdata uploaden naar publieke AI-tools. Iedereen werkt vanuit dezelfde beheerde databron en gedeelde bedrijfsdefinities.
  • Versleuteld in transit. Alle verbindingen tussen componenten maken gebruik van versleutelde kanalen. API sleutels en databasereferenties worden in rust versleuteld met AES-256 en opgeslagen in Azure Key Vault.
  • Authenticatie. Toegang tot het beheerplatform (Control Plane) vereist Microsoft authenticatie. Gebruikerstoegang tot de Vegoia interface wordt per account beheerd door Victa beheerders.
  • Geen persistente dataopslag. De backend verwerkt data in geheugen en slaat queryresultaten niet op na het afleveren van het antwoord. Als de frontend wordt gebruikt, wordt chatgeschiedenis per gebruiker opgeslagen binnen de Azure omgeving totdat deze wordt verwijderd.

Supporttoegang

Victa houdt een guest-adminaccount aan in de Entra tenant van jouw organisatie voor supporttoegang. Dit account wordt verwijderd bij offboarding — wanneer het Victa-teamlid vertrekt, of de samenwerking eindigt.

Verdeling van verantwoordelijkheden

  • Jouw organisatie is verantwoordelijk voor: de beschikbaar gestelde data, toegangsrechten, naleving van toepasselijke wet- en regelgeving en contracten, en de beslissing de frontend in te zetten en chatopslag te accepteren.
  • Victa is verantwoordelijk voor: veilige hosting, infrastructuurbeheer, isolatie tussen klanten en operationele logging en monitoring.

Als je toegang nodig hebt tot een nieuwe dataset of schema, neem dan contact op met Victa om deze toe te voegen aan het semantisch model.

Appendix: oude chatcommando's (verwijderd)

Deze commando's werken niet meer. Ze staan hier ter referentie; gebruik in plaats daarvan de Curation Hub.

Vier commando's waarmee je vroeger de kennislagen direct vanuit de chat kon organiseren, bijwerken en opbouwen. Commando's omzeilden de normale vraagpipeline volledig en gingen direct naar de laagbewerkingsstroom.

Hoe je deze vroeger gebruikte, in volgorde:

  1. Voer eenmalig /sections generate uit, voordat je concepten aanmaakte. Secties moesten eerst bestaan.
  2. Maak concepten aan met /concept en corrigeer de fysieke laag met /update, in beide volgorden, zo vaak als nodig.
  3. Gebruik /review periodiek om te zien wat er nog moest worden ingevuld.

/sections — admin, behalve show

Organiseerde concepten in benoemde secties (bijv. "Verkoopprestaties", "Financiële planning") zodat de conceptbibliotheek leesbaar bleef naarmate deze groeide, en zodat retrieval kon bepalen welke concepten relevant waren voordat ze werden ingelezen.

SyntaxRolDoel
/sections generateadminStel een sectietaxonomie voor op basis van de fysieke laag. Eenmaal uitvoeren, voordat er concepten bestaan.
/sections okadminAccepteer en sla het voorstel op.
/sections stopadminAnnuleer het voorstel.
/sections <instructie>adminVerfijn het voorstel.
/sections showalle rollenToon de huidige secties.
/sections update <naam> <instructie>adminVerfijn één bestaande sectie.

/concept — admin, behalve all en <tag>

Stelde concepten (bedrijfsdefinities) voor, inspecteerde en beheerde ze in de conceptlaag.

SyntaxRolDoel
/concept <beschrijving>adminStel een nieuw concept voor op basis van een beschrijving in gewone taal (optioneel met SQL).
/concept okadminAccepteer en sla het voorstel op.
/concept stopadminAnnuleer het voorstel.
/concept <instructie>adminVerfijn het voorstel.
/concept allalle rollenToon alle opgeslagen concepten, gegroepeerd per sectie en topic.
/concept <tag>alle rollenToon één opgeslagen concept op basis van de tag.
/concept <tag> deleteadminVerwijder een opgeslagen concept.
/concept update <tag> <instructie>adminWerk een bestaand concept bij.

Voorstellen uit feedback. Wanneer feedback van een gebruiker op een antwoord een nieuw of gewijzigd concept suggereerde, zette Vegoia dit klaar als een voorstel in plaats van rechtstreeks een /concept aanroep te doen:

SyntaxRolDoel
/concept proposaladminToon alle openstaande voorstellen.
/concept proposal <tag>adminToon één openstaand voorstel.
/concept proposal <tag> okadminAccepteer het voorstel, waardoor het een actief concept wordt.
/concept proposal <tag> stopadminVerwerp het voorstel.
/concept proposal <tag> <instructie>adminVerfijn het voorstel en zet het opnieuw klaar.

Analyse. /concept analyze (admin) toonde feedbackstatistieken voor alle concepten, zodat je kon zien welke goed of slecht presteerden.

/update — admin, behalve show

Stelde correcties voor op hoe jouw data in de fysieke laag was beschreven. Wijzigingen werden geschreven naar een sandbox kopie — niets werd toegepast totdat je bevestigde.

SyntaxRolDoel
/update <beschrijving>adminStel een correctie op de fysieke laag voor op basis van een beschrijving in gewone taal.
/update okadminPas het voorstel toe.
/update stopadminAnnuleer het voorstel.
/update <instructie>adminVerfijn het voorstel — de agent herhaalde de run met jouw originele beschrijving plus de nieuwe instructie, zodat context niet verloren ging tussen beurten.
/update showalle rollenToon alle kolommen die zijn opgelost via /update.

/review — alle rollen

Toonde kolommen in de fysieke laag die nog aandacht nodig hadden.

SyntaxRolDoel
/reviewalle rollenToon kolommen die aandacht nodig hebben (dubbelzinnige of onduidelijke classificatie).
/review allalle rollenToon ook categorische kolommen met gecodeerde waarden waarvan de betekenis nog niet is ingevuld.