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.
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 |
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.
AI Mechanics
How each AI feature is computed — guardrails, audit schema, and the cost-resilience stack. Expand any item for implementation details.
Role Suggestions LLM + RAG
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.
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
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.
JSON// employee → learning_path
{
"enabled": true,
"ttl_hours": 48,
"guardrails": {
"max_nodes": 12,
"include_certs": true
}
}
Opportunity Match Score Deterministic
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.
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
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.
JSON// employee → ai_advice
{
"enabled": true,
"ttl_hours": 2,
"guardrails": {
"min_profile": "spec+seniority+3 skills+goal",
"strip_uuids": true,
"strip_citations": true
}
}
AI Coaching Advice LLM + RAG
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).
JSON// coach → coaching_advice
{
"enabled": true,
"ttl_hours": 6,
"guardrails": {
"strip_pii": true,
"max_tokens": 800
}
}
Suggest Employees for Opportunity LLM + Scoring
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.
JSON// coach → opportunity_match
{
"enabled": true,
"ttl_hours": 12,
"guardrails": {
"top_n": 3,
"min_match_score": 0.2
}
}
Intelligence Digest LLM + RAG
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.
JSON// coach → intelligence_digest
{
"enabled": true,
"ttl_hours": 168,
"guardrails": {
"max_sections": 5
}
}
AI Workflow Connector — live config, no deploy Admin UI
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.
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
- Prompt-shape budget — top-3 opportunities, strategy 800 chars, chat history 4 turns. 25–35% input-token cut.
- Response-hash cache — Redis key
cf:airesp:<sha>, 5-min TTL. - Multi-replica circuit breaker — Redis-backed open state across all replicas.
- Connector freshness gauge —
cf_connector_last_sync_seconds+ alert at 24 h. - Anthropic prompt cache — ephemeral
cache_controlon system prompt; ~90% input-cost cut on cache hits.
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
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.
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.
| Person | Role | 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