Last updated: 4 May 2026 · Demo presenter guide

Demo Guide

Not an AI product. An organisational readiness system that has AI in it — in the right place. This guide walks three audiences through the platform: executive buyers, technical evaluators, and live demo presenters.

212 employees 4 portals 8 AI features 6 AI docs ingested 4/4 connectors healthy

AI Features

Eight AI features across four portals. Each is independently configurable — enable/disable, change TTL, swap model, adjust guardrails — all from the Admin UI without a code deploy.

Feature What it does Mechanic
Learning Paths Node-graph of skills, certs, projects, milestones tailored to career goal and seniority gap. Cached 48 h. LLM RAG
Role Suggestions Up to 5 matching roles ranked by deterministic skill-overlap score. RAG-grounded against role catalogue. LLM RAG
Opportunity Matching Inline match score for every published opportunity: green ≥70%, yellow 40–69%, grey <40%. Pure SQL — no LLM call. Deterministic
Career Advice / AI Chat Multi-turn chat grounded in 4 pillars: anonymised profile, top-5 opportunities, Industry 4.0 readiness, company strategy. Off-topic → clean refusal. LLM
Coaching Advice Coach asks free-text question; backend resolves pseudo-ID, anonymises, RAG-enriches, returns Markdown. No PII leaves the system. LLM RAG
Employee Suggestions for Opportunity Top-3 candidates ranked by skill overlap + LLM narrative per candidate. Audited. Cached per opportunity until TTL. LLM Scoring
Intelligence Digest Weekly AI report: rising skills, role movements, L&D recommendations for the coaching team. Cached 7 days. LLM RAG
Industry 4.0 Readiness Deterministic score per employee based on skill coverage against the 4.0 taxonomy. Aggregated to org-level in Admin. Deterministic
Admin override, zero deploy. Every feature above can be toggled off, its TTL extended, its model swapped, and its guardrail thresholds changed in Admin → Connectors → AI Workflow. Changes propagate after the 5-minute cache window.

Persona Walkthroughs

Step-by-step demo scripts for each persona. Tick steps as you go — progress is saved locally per persona. Use ← → keys to switch tabs.

Employee Portal
maria.demo@accesa.eu · Demo2026!
Open Portal ↗
8 steps
Coach Portal
coach.demo@accesa.eu · Demo2026!
Open Portal ↗
8 steps
Manager Portal
alex.manager@accesa.eu · Demo2026!
Open Portal ↗
7 steps
Admin Portal
admin.demo@accesa.eu · Demo2026!
Open Portal ↗
5 steps

AI Mechanics

How each AI feature is computed — guardrails, audit schema, and the cost-resilience stack. Expand any item for implementation details.

Employee Portal
Role Suggestions LLM + RAG
How it's computed

Employee's skills, seniority, and specialisation are serialised into a prompt. The active AI Workflow provider is called via get_role_suggestions_for_profile(). RAG prepends relevant role-catalogue and trend chunks from ai_documents. A deterministic match_score is appended per role: |emp_skills ∩ required| / |required|. Roles below min_match_score: 0.3 are filtered before returning.

Guardrails (coverage_config)
JSON// employee → role_suggestions
{
  "enabled":          true,
  "ttl_hours":        24,
  "model_override":   null,
  "guardrails": {
    "max_roles":       5,
    "min_match_score": 0.3
  }
}
Learning Path LLM + RAG
How it's computed

Skill set, career goal, and seniority gap combined with RAG context (skill docs, cert data). The LLM returns a node-graph JSON with node types: skill, cert, project, milestone. Output validated for structure. Nodes exceeding max_nodes trimmed (lowest priority first). Cached 48 h.

Guardrails
JSON// employee → learning_path
{
  "enabled":        true,
  "ttl_hours":      48,
  "guardrails": {
    "max_nodes":     12,
    "include_certs": true
  }
}
Opportunity Match Score Deterministic
How it's computed

No LLM. For every published opportunity, at query time:

Pythonoverlap = emp_skills ∩ opp.required_skills
score   = len(overlap) / len(required_skills)

Badge colour: green ≥ 70%, yellow 40–69%, grey < 40%. Score attached inline in the opportunities list SQL query — no separate API call. Nothing written to the audit log.

Guardrails
JSON// employee → opportunities_matching
{
  "enabled":    true,
  "ttl_hours":  6,
  "guardrails": {
    "min_match_score": 0.2
  }
}

Opportunities below min_match_score are still shown but de-emphasised.

Career Advice / AI Chat LLM + 4 pillars
How it's computed

Backend assembles a strict 4-pillar context: anonymised profile (skills resolved from SkillTaxonomy — UUIDs never sent), top 5 active opportunities ranked by skill overlap, the latest Industry 4.0 readiness snapshot, and the active workflow's company strategy notes.

Profile too thin (< 3 skills, no specialisation/seniority/career goal) → 422 refusal, not fabrication. Off-context questions get a clean refusal. Multi-turn chat caps history at 6 turns and user messages at 1 500 chars.

Guardrails
JSON// employee → ai_advice
{
  "enabled":    true,
  "ttl_hours":  2,
  "guardrails": {
    "min_profile":     "spec+seniority+3 skills+goal",
    "strip_uuids":     true,
    "strip_citations": true
  }
}
Coach Portal
AI Coaching Advice LLM + RAG
How it's computed

Coach submits a free-text question about an employee identified by pseudo-ID. The backend resolves the pseudo-ID to an anonymised profile (no PII), combines it with RAG context from market documents, and calls the active AI Workflow provider. Response rendered as Markdown via CfMdText (marked + DOMPurify).

Guardrails
JSON// coach → coaching_advice
{
  "enabled":    true,
  "ttl_hours":  6,
  "guardrails": {
    "strip_pii":  true,
    "max_tokens": 800
  }
}
Suggest Employees for Opportunity LLM + Scoring
How it's computed

All employees scored deterministically by skill overlap against the opportunity's required skills. Top 3 candidates passed to the LLM for a brief narrative explanation per candidate. Every call writes an audit log entry. Results cached per opportunity until TTL expires.

Guardrails
JSON// coach → opportunity_match
{
  "enabled":    true,
  "ttl_hours":  12,
  "guardrails": {
    "top_n":           3,
    "min_match_score": 0.2
  }
}
Intelligence Digest LLM + RAG
How it's computed

Weekly AI report covering: top rising skills across the market, role movements, and recommended L&D actions for the coaching team. Seeded from ai_documents (market trends, role catalogue) via RAG. Cached 7 days; coaches can force-regenerate via Refresh.

Guardrails
JSON// coach → intelligence_digest
{
  "enabled":   true,
  "ttl_hours": 168,
  "guardrails": {
    "max_sections": 5
  }
}
Admin & Cross-cutting
AI Workflow Connector — live config, no deploy Admin UI
What you control

In Admin → Connectors → AI Workflow, each config has expandable per-feature panels. Per feature you can change: enabled, TTL hours, model override, and any guardrail key/values. Changes are live after the 5-min cache window.

Self-hosted AI support

Set provider to self_hosted. Enter a base_url (e.g. http://ollama:11434). The connector auto-appends /v1 and calls /v1/chat/completions (OpenAI-compatible). Bearer auth optional. Works with Ollama, LM Studio, vLLM.

Five-layer cost & resilience stack All providers
What it does
  1. Prompt-shape budget — top-3 opportunities, strategy 800 chars, chat history 4 turns. 25–35% input-token cut.
  2. Response-hash cache — Redis key cf:airesp:<sha>, 5-min TTL.
  3. Multi-replica circuit breaker — Redis-backed open state across all replicas.
  4. Connector freshness gauge — cf_connector_last_sync_seconds + alert at 24 h.
  5. Anthropic prompt cache — ephemeral cache_control on system prompt; ~90% input-cost cut on cache hits.
Observability
PromQLcf_suggestion_calls_total{outcome}
cf_prompt_cache_tokens_total{provider,direction}
cf_connector_last_sync_seconds{connector}
cf_llm_calls_total{provider,model,outcome}
cf_llm_artifacts_scrubbed_total{kind}

Fail-open everywhere: cache, breaker, and quota helpers all degrade to no-op when Redis is unreachable.

Vector cosine RAG retrieval All providers
What it does

Every AI function that needs grounding chunks calls _cached_text_search(). The helper embeds the query via the configured embedding provider and orders ai_document_vectors by cosine distance. Cosine similarity matches synonyms: "AWS" ↔ "Amazon Web Services", "k8s" ↔ "Kubernetes".

Fallback: if embedding generation fails, falls through to LIKE-based search. RAG is never blocked.

SQL shape
SQLSELECT d.title, d.source_name,
  substring(v.chunk_text from 1 for 600),
  1 - (v.embedding <=> :qvec) AS score
FROM ai_document_vectors v
JOIN ai_documents d ON d.id = v.document_id
ORDER BY v.embedding <=> :qvec
LIMIT :k

Demo Credentials

Shared demo accounts. Each portal has its own Keycloak realm — use the email below. Password is masked by default.

Demo user credentials by portal
Person Role Email Password Portal
Maria Demo Fullstack · Mid maria.demo@accesa.eu
••••••••
Employee ↗
Coach Demo HR Coach coach.demo@accesa.eu
••••••••
Coach ↗
Alex Manager Backend Lead · Manager alex.manager@accesa.eu
••••••••
Manager ↗
Admin Demo Platform Administrator admin.demo@accesa.eu
••••••••
Admin ↗

All accounts use Demo2026! · Shared demo credentials