{"id":121689,"date":"2026-06-04T16:55:09","date_gmt":"2026-06-04T14:55:09","guid":{"rendered":"https:\/\/aixia.se\/?p=121689"},"modified":"2026-06-04T20:42:10","modified_gmt":"2026-06-04T18:42:10","slug":"the-agent-that-watches-our-trainings","status":"publish","type":"post","link":"https:\/\/aixia.se\/en\/the-agent-that-watches-our-trainings\/","title":{"rendered":"The agent that watches our\u00a0trainings"},"content":{"rendered":"\n<!-- ============================================================\n     AIXIA NEWS ARTICLE  \u00b7  paste into a single Gutenberg \"Custom HTML\" block\n     All styling is scoped to .aixia-news so it CANNOT affect the theme\n     header\/footer or other pages. The hero photo is embedded inline.\n     ============================================================ -->\n<!--  OPTIONAL \u2014 brand display font (headings).\n      Headings fall back to Helvetica\/Arial (Aixia's brand body font) unless this is enabled.\n      Only enable if Aixia's MADE Evolve Sans licence permits web embedding.\n      Upload the .otf\/.woff2 weights to the Media Library, then uncomment & fix the URLs:\n  <style>\n  @font-face{font-family:\"MADE Evolve Sans\";font-weight:300;font-style:normal;src:url(\"FONT_LIGHT_URL\")    format(\"opentype\");font-display:swap}\n  @font-face{font-family:\"MADE Evolve Sans\";font-weight:400;font-style:normal;src:url(\"FONT_REGULAR_URL\")  format(\"opentype\");font-display:swap}\n  @font-face{font-family:\"MADE Evolve Sans\";font-weight:700;font-style:normal;src:url(\"FONT_BOLD_URL\")     format(\"opentype\");font-display:swap}\n  <\/style>\n-->\n<div class=\"aixia-news\">\n<style>\n.aixia-news {\n  --hero-img: url(\"__HERO_IMAGE_URL__\");  \/* <-- paste the Media Library URL of aixia-hero.webp here *\/ --aixia-ink: #000000; --aixia-paper: #FFFFFF; --aixia-blue: #78A0B3; --aixia-purple: #56529F; --aixia-pink: #E84BD1; --aixia-symbol-orange: #F18A3F; --aixia-ink-92: #141414; --aixia-ink-80: #333333; --aixia-ink-64: #5C5C5C; --aixia-ink-48: #858585; --aixia-ink-24: #C2C2C2; --aixia-ink-12: #E0E0E0; --aixia-ink-06: #F0F0F0; --aixia-ink-03: #F7F7F7; --fg-1: var(--aixia-ink); --fg-2: var(--aixia-ink-64); --fg-3: var(--aixia-ink-48); --fg-on-dark: var(--aixia-paper); --fg-muted-on-dark: rgba(255, 255, 255, 0.72); --bg-1: var(--aixia-paper); --bg-2: var(--aixia-ink-03); --bg-3: var(--aixia-ink-06); --bg-inverse: var(--aixia-ink); --bg-accent-blue: var(--aixia-blue); --bg-accent-blue-tint: #EAF0F3; --border-1: rgba(0, 0, 0, 0.08); --border-2: rgba(0, 0, 0, 0.16); --border-strong: #000000; --border-on-dark: rgba(255, 255, 255, 0.16); --focus-ring: 0 0 0 2px var(--aixia-blue); --focus-offset: 2px; --shadow-0: none; --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.06); --shadow-2: 0 10px 30px rgba(0, 0, 0, 0.08); --shadow-hero: 0 40px 80px rgba(0, 0, 0, 0.18); --radius-0: 0; --radius-1: 4px; --radius-2: 8px; --radius-pill: 999px; --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px; --space-9: 80px; --space-10: 96px; --space-11: 120px; --space-12: 160px; --container-max: 1440px; --container-wide: 1280px; --container-narrow: 960px; --container-reading: 720px; --page-pad-mobile: 24px; --page-pad-desktop: 80px; --nav-height: 72px; --nav-height-mobile: 60px; --ease-out: cubic-bezier(0.22, 1, 0.36, 1); --ease-std: cubic-bezier(0.4, 0, 0.2, 1); --dur-fast: 150ms; --dur-base: 250ms; --dur-slow: 500ms; --font-sans: \"Helvetica Neue\", Helvetica, Arial, sans-serif; --font-display: \"MADE Evolve Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif; --font-mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace; --fw-regular: 400; --fw-medium: 500; --fw-bold: 700; --fs-display-1: clamp(48px, 7vw, 96px); --fs-display-2: clamp(40px, 5.5vw, 72px); --fs-h1: clamp(36px, 4.5vw, 56px); --fs-h2: clamp(28px, 3.2vw, 40px); --fs-h3: 24px; --fs-h4: 20px; --fs-preheadline: 13px; --fs-body-lg: 18px; --fs-body: 16px; --fs-body-sm: 14px; --fs-fine: 13px; --fs-caption: 12px; --lh-tight: 1.05; --lh-snug: 1.2; --lh-normal: 1.5; --lh-loose: 1.6; --lh-body: 1.55; --tracking-tight: -0.02em; --tracking-normal: 0; --tracking-wide: 0.04em; --tracking-uppercase: 0.08em; }\n.aixia-news { font-family: var(--font-sans); font-size: var(--fs-body); line-height: var(--lh-body); color: var(--fg-1); background: var(--bg-1); -webkit-font-smoothing: antialiased; text-rendering: optimizelegibility; }\n.aixia-news { margin: 0px; font-family: var(--font-sans); color: var(--fg-1); background: var(--bg-1); }\n.aixia-news .aixia-display-1 { font-family: var(--font-display); font-weight: var(--fw-regular); font-size: var(--fs-display-1); line-height: var(--lh-tight); letter-spacing: var(--tracking-tight); margin: 0px; }\n.aixia-news .aixia-display-2 { font-family: var(--font-display); font-weight: var(--fw-regular); font-size: var(--fs-display-2); line-height: var(--lh-tight); letter-spacing: var(--tracking-tight); margin: 0px; }\n.aixia-news h1, .aixia-news .aixia-h1 { font-family: var(--font-display); font-weight: var(--fw-regular); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tracking-tight); margin: 0 0 var(--space-5); }\n.aixia-news h2, .aixia-news .aixia-h2 { font-family: var(--font-display); font-weight: var(--fw-regular); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tracking-tight); margin: 0 0 var(--space-4); }\n.aixia-news h3, .aixia-news .aixia-h3 { font-weight: var(--fw-bold); font-size: var(--fs-h3); line-height: var(--lh-snug); margin: 0 0 var(--space-3); }\n.aixia-news h4, .aixia-news .aixia-h4 { font-weight: var(--fw-bold); font-size: var(--fs-h4); line-height: var(--lh-snug); margin: 0 0 var(--space-3); }\n.aixia-news .aixia-preheadline { font-family: var(--font-sans); font-weight: var(--fw-bold); font-size: var(--fs-preheadline); line-height: var(--lh-snug); letter-spacing: var(--tracking-uppercase); text-transform: uppercase; color: var(--fg-2); margin: 0 0 var(--space-3); }\n.aixia-news p, .aixia-news .aixia-body { font-family: var(--font-sans); font-weight: var(--fw-regular); font-size: var(--fs-body); line-height: var(--lh-body); color: var(--fg-1); margin: 0 0 var(--space-4); text-wrap: pretty; }\n.aixia-news .aixia-body-lg { font-size: var(--fs-body-lg); line-height: var(--lh-loose); }\n.aixia-news .aixia-body-sm { font-size: var(--fs-body-sm); line-height: var(--lh-body); }\n.aixia-news .aixia-fine { font-family: var(--font-sans); font-style: italic; font-size: var(--fs-fine); line-height: var(--lh-normal); color: var(--fg-2); }\n.aixia-news .aixia-caption { font-size: var(--fs-caption); line-height: var(--lh-normal); letter-spacing: var(--tracking-wide); color: var(--fg-2); text-transform: uppercase; }\n.aixia-news a, .aixia-news .aixia-link { color: inherit; text-decoration: underline 1px; text-underline-offset: 3px; transition: opacity var(--dur-fast) var(--ease-std); }\n.aixia-news a:hover, .aixia-news .aixia-link:hover { opacity: 0.7; }\n.aixia-news code, .aixia-news .aixia-code { font-family: var(--font-mono); font-size: 0.92em; background: var(--bg-3); padding: 0.12em 0.4em; border-radius: var(--radius-1); }\n.aixia-news .aixia-container { max-width: var(--container-wide); margin: 0px auto; padding: 0 var(--page-pad-desktop); }\n.aixia-news .aixia-container-narrow { max-width: var(--container-narrow); margin: 0px auto; padding: 0 var(--page-pad-desktop); }\n.aixia-news .aixia-container-reading { max-width: var(--container-reading); margin: 0px auto; padding: 0 var(--page-pad-desktop); }\n.aixia-news .aixia-on-dark { color: var(--fg-on-dark); background: var(--bg-inverse); }\n.aixia-news .aixia-on-blue { color: var(--fg-on-dark); background: var(--aixia-blue); }\n.aixia-news .aixia-rule { border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top: 1px solid var(--border-strong); margin: 0px; }\n.aixia-news .aixia-rule-soft { border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top: 1px solid var(--border-1); margin: 0px; }\n@media (max-width: 768px) {\n.aixia-news .aixia-container, .aixia-news .aixia-container-narrow, .aixia-news .aixia-container-reading { padding: 0 var(--page-pad-mobile); }\n}\n.aixia-news *, .aixia-news ::before, .aixia-news ::after { box-sizing: border-box; }\n.aixia-news { margin: 0px; background: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: var(--font-sans); -webkit-font-smoothing: antialiased; }\n.aixia-news img { display: block; max-width: 100%; }\n.aixia-news a { color: inherit; }\n.aixia-news .nav-wrap { position: sticky; top: 0px; z-index: 50; background: rgba(255, 255, 255, 0.92); backdrop-filter: blur(10px); border-bottom: 1px solid rgba(0, 0, 0, 0.06); }\n.aixia-news .nav { max-width: 1280px; margin: 0px auto; padding: 0px 40px; height: 72px; display: flex; align-items: center; justify-content: space-between; }\n.aixia-news .nav-logo { height: 22px; }\n.aixia-news .nav-menu { display: flex; gap: 32px; list-style: none; margin: 0px; padding: 0px; font-size: 14px; }\n.aixia-news .nav-menu a { text-decoration: none; cursor: pointer; transition: opacity 0.15s ease-out; }\n.aixia-news .nav-menu a:hover { opacity: 0.6; }\n.aixia-news .nav-menu a.active { font-weight: 700; }\n.aixia-news .nav-cta { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; font-size: 14px; padding: 11px 18px; border-radius: 4px; background: rgb(0, 0, 0); color: rgb(255, 255, 255); border: 0px; cursor: pointer; text-decoration: none; transition: background 0.18s ease-out; }\n.aixia-news .nav-cta:hover { background: rgb(26, 26, 26); }\n@media (max-width: 900px) {\n.aixia-news .nav-menu { display: none; }\n}\n.aixia-news .hero { position: relative; min-height: 640px; display: flex; align-items: flex-end; color: rgb(255, 255, 255); overflow: hidden; background: rgb(27, 42, 54); }\n.aixia-news .hero-bg { position: absolute; inset: 0px; background: var(--hero-img) center 32% \/ cover no-repeat; }\n.aixia-news .hero-overlay { position: absolute; inset: 0px; background: linear-gradient(rgba(15, 24, 33, 0.3) 0%, rgba(15, 24, 33, 0) 30%, rgba(15, 24, 33, 0.45) 62%, rgba(11, 18, 24, 0.88) 100%), linear-gradient(90deg, rgba(11, 18, 24, 0.75) 0%, rgba(11, 18, 24, 0.3) 42%, rgba(11, 18, 24, 0) 72%); }\n.aixia-news .hero-inner { position: relative; max-width: 1280px; width: 100%; margin: 0px auto; padding: 0px 40px; }\n.aixia-news .hero-content { max-width: 760px; padding: 120px 0px 72px; }\n.aixia-news .eyebrow { font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--aixia-blue); margin: 0px 0px 22px; display: flex; align-items: center; gap: 12px; }\n.aixia-news .eyebrow::before { content: \"\"; width: 28px; height: 1px; background: var(--aixia-blue); display: inline-block; }\n.aixia-news .hero h1 { font-family: var(--font-display); font-weight: 400; font-size: clamp(40px, 6vw, 76px); line-height: 1.04; letter-spacing: -0.02em; margin: 0px; color: rgb(255, 255, 255); text-wrap: balance; }\n.aixia-news .hero h1 em { font-style: normal; color: rgb(255, 255, 255); }\n.aixia-news .hero-lede { font-size: clamp(18px, 2vw, 21px); line-height: 1.6;  max-width: 620px; margin: 26px 0px 0px; }\n.aixia-news .hero-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 36px; font-size: 13px; color: rgba(255, 255, 255, 0.7); letter-spacing: 0.02em; }\n.aixia-news .hero-meta .dot { width: 3px; height: 3px; border-radius: 50%; background: rgba(255, 255, 255, 0.45); }\n.aixia-news article { max-width: 720px; margin: 0px auto; padding: 0px 32px 40px; }\n\n.aixia-news article p { font-size: 18px; line-height: 1.7; color: rgb(26, 26, 26); margin: 0px 0px 20px; text-wrap: pretty; }\n.aixia-news article p.lede { font-size: 21px; line-height: 1.6; color: rgb(0, 0, 0); }\n.aixia-news article em { font-style: italic; }\n.aixia-news .accent { color: rgb(74, 107, 122); font-style: normal; font-weight: 700; }\n.aixia-news .divider { border-width: 1px 0px 0px; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; border-top-style: solid; border-top-color: rgba(0, 0, 0, 0.1); margin: 56px 0px; }\n.aixia-news h2 { font-family: var(--font-display); font-weight: 400; font-size: clamp(28px, 3.4vw, 38px); line-height: 1.15; letter-spacing: -0.02em; color: rgb(0, 0, 0); margin: 0px 0px 22px; }\n.aixia-news .sec-eyebrow { font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: rgb(92, 92, 92); margin: 0px 0px 14px; }\n.aixia-news .sec { margin: 64px 0px 0px; }\n.aixia-news code { font-family: var(--font-mono); font-size: 0.86em; background: rgb(240, 240, 240); color: rgb(26, 26, 26); padding: 0.12em 0.42em; border-radius: 4px; }\n.aixia-news .wide { max-width: 1000px; margin-left: auto; margin-right: auto; padding: 0px 32px; }\n.aixia-news .videoblock { margin: 56px 0px; }\n.aixia-news .video-frame { position: relative; aspect-ratio: 9 \/ 16; width: 100%; border-radius: 8px; overflow: hidden; background: rgb(11, 17, 24); border: 1px solid rgba(0, 0, 0, 0.1); display: flex; align-items: center; justify-content: center; }\n.aixia-news .video-frame video { width: 100%; height: 100%; object-fit: contain; }\n.aixia-news .video-ph { position: absolute; inset: 0px; background: linear-gradient(rgba(11, 17, 24, 0.45), rgba(11, 17, 24, 0.7)), var(--hero-img) center 38% \/ cover no-repeat; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; color: rgb(255, 255, 255); text-align: center; padding: 24px; }\n.aixia-news .play { width: 76px; height: 76px; border-radius: 50%; background: rgba(255, 255, 255, 0.12); border: 1.5px solid rgba(255, 255, 255, 0.7); display: flex; align-items: center; justify-content: center; backdrop-filter: blur(4px); }\n.aixia-news .play svg { margin-left: 4px; }\n.aixia-news .video-ph .vlabel { font-size: 13px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--aixia-blue); }\n.aixia-news .video-ph .vnote { font-size: 14px; color: rgba(255, 255, 255, 0.78); max-width: 380px; line-height: 1.55; }\n.aixia-news .video-cap { font-style: italic; font-size: 14px; color: rgb(92, 92, 92); margin: 14px 2px 0px; }\n.aixia-news .arch-wrap { margin: 48px 0px; border: 1px solid rgba(0, 0, 0, 0.12); border-radius: 8px; overflow: hidden; background: rgb(255, 255, 255); }\n.aixia-news .arch-header { display: flex; align-items: center; gap: 10px; padding: 14px 22px; border-bottom: 1px solid rgba(0, 0, 0, 0.1); background: rgb(247, 247, 247); }\n.aixia-news .arch-title { font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: rgb(92, 92, 92); }\n.aixia-news .arch-canvas { padding: 44px 32px 48px; display: flex; flex-direction: column; align-items: center; }\n.aixia-news .diag-node { border-radius: 6px; display: flex; align-items: center; gap: 12px; padding: 14px 22px; font-size: 14px; font-weight: 700; border: 1px solid; position: relative; background: rgb(255, 255, 255); }\n.aixia-news .diag-node.user { border-color: rgb(0, 0, 0); color: rgb(0, 0, 0); width: 280px; justify-content: center; }\n.aixia-news .diag-node.agent { border-color: var(--aixia-blue); width: 100%; max-width: 580px; flex-direction: column; align-items: stretch; gap: 14px; padding: 22px 26px; background: rgb(234, 240, 243); }\n.aixia-news .agent-label { font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: rgb(74, 107, 122); }\n.aixia-news .agent-inner { display: flex; gap: 10px; flex-wrap: wrap; }\n.aixia-news .agent-chip { background: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.14); border-radius: 6px; padding: 8px 14px; font-size: 13px; font-weight: 400; color: rgb(26, 26, 26); display: flex; align-items: center; gap: 8px; }\n.aixia-news .agent-chip .cdot { width: 7px; height: 7px; border-radius: 50%; background: var(--aixia-blue); flex-shrink: 0; }\n.aixia-news .agent-chip .cdot.ink { background: rgb(0, 0, 0); }\n.aixia-news .arrow-line { width: 1.5px; height: 44px; background: rgba(0, 0, 0, 0.22); position: relative; }\n.aixia-news .arrow-line::after { content: \"\"; position: absolute; bottom: 0px; left: 50%; transform: translateX(-50%); border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 6px solid rgba(0, 0, 0, 0.3); }\n.aixia-news .arrow-tag { font-size: 11px; color: rgb(92, 92, 92); letter-spacing: 0.02em; padding: 8px 0px; }\n.aixia-news .leaves-row { display: flex; gap: 18px; align-items: flex-start; flex-wrap: wrap; justify-content: center; }\n.aixia-news .leaf-col { display: flex; flex-direction: column; align-items: center; }\n.aixia-news .leaf-col .arrow-line { height: 40px; }\n.aixia-news .leaf-tag { font-size: 10px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: rgb(92, 92, 92); padding: 6px 0px 0px; }\n.aixia-news .diag-node.leaf { font-size: 13px; padding: 12px 18px; border-color: rgba(0, 0, 0, 0.18); color: rgb(26, 26, 26); }\n.aixia-news .diag-node.leaf.blue { border-color: var(--aixia-blue); color: rgb(74, 107, 122); }\n.aixia-news .leaf-sub { font-size: 11px; color: rgb(92, 92, 92); margin-top: 8px; text-align: center; line-height: 1.5; }\n.aixia-news .callout { margin: 40px 0px; padding: 26px 28px; border-radius: 8px; background: rgb(247, 247, 247); border-left: 3px solid rgb(0, 0, 0); }\n.aixia-news .callout.blue { border-left-color: var(--aixia-blue); background: rgb(234, 240, 243); }\n.aixia-news .callout-head { font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: rgb(92, 92, 92); margin: 0px 0px 10px; }\n.aixia-news .callout.blue .callout-head { color: rgb(74, 107, 122); }\n.aixia-news .callout p { font-size: 17px; line-height: 1.6; color: rgb(26, 26, 26); margin: 0px; }\n.aixia-news .protocol { background: rgb(0, 0, 0); color: rgb(255, 255, 255); border-radius: 8px; padding: 32px 34px; margin: 36px 0px; }\n.aixia-news .protocol-head { font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: rgba(255, 255, 255, 0.6); margin: 0px 0px 22px; }\n.aixia-news .protocol ol { margin: 0px; padding: 0px; list-style: none; counter-reset: step 0; }\n.aixia-news .protocol li { position: relative; padding: 0px 0px 18px 52px; font-size: 17px; line-height: 1.5; color: rgba(255, 255, 255, 0.92); counter-increment: step 1; }\n.aixia-news .protocol li:last-child { padding-bottom: 0px; }\n.aixia-news .protocol li::before { content: counter(step, decimal-leading-zero); position: absolute; left: 0px; top: 0px; font-family: var(--font-display); font-size: 17px; font-weight: 400; color: var(--aixia-blue); }\n.aixia-news .protocol li strong { color: rgb(255, 255, 255); font-weight: 700; }\n.aixia-news .chat-wrap { margin: 48px auto; max-width: 460px; }\n.aixia-news .chat-phone { background: rgb(255, 255, 255); border-radius: 16px; overflow: hidden; border: 1px solid rgba(0, 0, 0, 0.1); box-shadow: rgba(0, 0, 0, 0.08) 0px 10px 30px; }\n.aixia-news .chat-header { display: flex; align-items: center; gap: 12px; padding: 14px 18px; border-bottom: 1px solid rgba(0, 0, 0, 0.08); background: rgb(255, 255, 255); }\n.aixia-news .chat-avatar { width: 38px; height: 38px; border-radius: 50%; background: var(--aixia-blue); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n.aixia-news .chat-avatar img { width: 22px; height: 22px; }\n.aixia-news .chat-name { font-size: 15px; font-weight: 700; color: rgb(0, 0, 0); }\n.aixia-news .chat-status { font-size: 12px; color: rgb(74, 107, 122); margin-top: 1px; display: flex; align-items: center; gap: 6px; }\n.aixia-news .chat-status::before { content: \"\"; width: 6px; height: 6px; border-radius: 50%; background: var(--aixia-blue); }\n.aixia-news .chat-messages { padding: 16px 14px 20px; display: flex; flex-direction: column; gap: 8px; background: rgb(247, 247, 247); }\n.aixia-news .chat-date { text-align: center; font-size: 11px; color: rgb(133, 133, 133); margin: 4px 0px; }\n.aixia-news .bubble { max-width: 84%; padding: 11px 14px; border-radius: 12px; font-size: 14px; line-height: 1.5; }\n.aixia-news .bubble.in { background: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.08); color: rgb(26, 26, 26); align-self: flex-start; border-bottom-left-radius: 3px; }\n.aixia-news .bubble.out { background: rgb(0, 0, 0); color: rgb(255, 255, 255); align-self: flex-end; border-bottom-right-radius: 3px; }\n.aixia-news .bubble .sender { font-size: 12px; font-weight: 700; color: rgb(74, 107, 122); margin-bottom: 4px; }\n.aixia-news .bubble strong { font-weight: 700; }\n.aixia-news .bubble .time { font-size: 10.5px; color: rgb(133, 133, 133); text-align: right; margin-top: 5px; }\n.aixia-news .bubble.out .time { color: rgba(255, 255, 255, 0.6); }\n.aixia-news .bubble code { background: rgb(240, 240, 240); color: rgb(26, 26, 26); font-size: 11.5px; }\n.aixia-news .bubble.out code { background: rgba(255, 255, 255, 0.16); color: rgb(255, 255, 255); }\n.aixia-news .badge { display: inline-block; padding: 3px 9px; border-radius: 4px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; margin-bottom: 8px; font-family: var(--font-mono); }\n.aixia-news .badge.info { background: rgb(234, 240, 243); color: rgb(74, 107, 122); }\n.aixia-news .badge.ok { background: var(--aixia-blue); color: rgb(255, 255, 255); }\n.aixia-news .badge.ink { background: rgb(0, 0, 0); color: rgb(255, 255, 255); }\n.aixia-news .badge.line { background: transparent; color: rgb(0, 0, 0); border: 1px solid rgb(0, 0, 0); }\n.aixia-news .metric { background: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 6px; padding: 9px 11px; margin-top: 8px; font-family: var(--font-mono); font-size: 11.5px; color: rgb(92, 92, 92); line-height: 1.7; }\n.aixia-news .metric .k { color: rgb(133, 133, 133); }\n.aixia-news .metric .v { color: rgb(0, 0, 0); font-weight: 700; }\n.aixia-news .metric .vb { color: rgb(74, 107, 122); font-weight: 700; }\n.aixia-news .filediff { background: rgb(255, 255, 255); border-left: 3px solid var(--aixia-blue); border-radius: 4px; padding: 9px 12px; margin-top: 10px; font-family: var(--font-mono); font-size: 11.5px; color: rgb(92, 92, 92); line-height: 1.8; }\n.aixia-news .filediff .path { color: rgb(74, 107, 122); }\n.aixia-news .filediff .rem { color: rgb(133, 133, 133); }\n.aixia-news .filediff .add { color: rgb(0, 0, 0); font-weight: 700; }\n.aixia-news .ticks { color: rgba(255, 255, 255, 0.6); }\n.aixia-news .closing-note { font-style: italic; color: rgb(92, 92, 92); font-size: 19px; margin-top: 32px; }\n.aixia-news .colophon { font-size: 14px; color: rgb(92, 92, 92); line-height: 1.7; }\n.aixia-news .colophon a { color: rgb(74, 107, 122); text-decoration: underline; text-underline-offset: 3px; }\n.aixia-news footer.site { background: rgb(0, 0, 0); color: rgb(255, 255, 255); padding: 80px 0px 40px; margin-top: 96px; }\n.aixia-news footer.site .fcon { max-width: 1280px; margin: 0px auto; padding: 0px 40px; }\n.aixia-news .footer-grid { display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr; gap: 40px; margin-bottom: 56px; }\n.aixia-news .footer-grid img { height: 24px; margin-bottom: 20px; }\n.aixia-news .footer-grid p { font-size: 14px; line-height: 1.6; color: rgba(255, 255, 255, 0.78); max-width: 320px; margin: 0px; }\n.aixia-news footer.site h4 { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; margin: 0px 0px 18px; color: rgba(255, 255, 255, 0.6); font-weight: 700; }\n.aixia-news footer.site ul { list-style: none; margin: 0px; padding: 0px; display: flex; flex-direction: column; gap: 10px; font-size: 14px; }\n.aixia-news footer.site a { text-decoration: none; }\n.aixia-news footer.site a:hover { opacity: 0.7; }\n.aixia-news .footer-bottom { display: flex; justify-content: space-between; padding-top: 24px; border-top: 1px solid rgba(255, 255, 255, 0.16); font-size: 12px; color: rgba(255, 255, 255, 0.6); }\n@media (max-width: 900px) {\n.aixia-news .footer-grid { grid-template-columns: 1fr 1fr; }\n.aixia-news .footer-bottom { flex-direction: column; gap: 12px; }\n}\n@media (max-width: 640px) {\n.aixia-news .nav { padding: 0px 24px; }\n.aixia-news .hero-inner { padding: 0px 24px; }\n.aixia-news .hero-content { padding: 96px 0px 56px; }\n.aixia-news article { padding: 0px 24px 40px; }\n.aixia-news .wide { padding: 0px 24px; }\n.aixia-news .arch-canvas { padding: 32px 18px 36px; }\n}\n<\/style>\n<!-- NAV removed \u2014 this post embeds into the existing aixia.se site chrome -->\n\n<!-- HERO -->\n\n<article>\n\n  <!-- SECTION 1 -->\n  <div class=\"article-intro\">\n<p class=\"hero-lede\">We built an encapsulated, self-hosted AI agent that sits between our GPU training jobs and a chat. This is how it works \u2014 and what it taught us about agents you can leave running near production.<\/p>\n\n    <p class=\"lede\">We train vision-based AI models that run on factory floors, doing everything from quality control to guiding robots. To keep each model sharp, we collect fresh examples from the floor and retrain on them, then tune hyperparameters to pull the most out of every model and dataset.<\/p>\n    <p>The counts climb fast. One site can run up to 40 models at once, each on a different part or view. Multiply that across customers, then add every retraining and tuning run behind each model, and the population of models and experiments grows past what anyone can track by hand.<\/p>\n    <p>That growth pushed us toward agents. We had more training runs than a person could watch. So we built one to watch them for us.<\/p>\n  <\/div>\n\n  <!-- VIDEO -->\n  <div class=\"videoblock\">\n    <div class=\"video-frame\">\n      \n     \n      \n         <video controls playsinline poster=\"POSTER_URL\"\n                style=\"position:absolute;inset:0;width:100%;height:100%;object-fit:cover\">\n           <source src=\"https:\/\/aixia.se\/wp-content\/uploads\/2026\/06\/TalktoyourMLOPs.mp4\" type=\"video\/mp4\">\n         <\/video>\n    <\/div>\n    <p class=\"video-cap\">Live: talking with the MLOps agent in plain language \u2014 ask what's running, and it answers.<\/p>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- ARCHITECTURE -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">The layout<\/p>\n    <h2>One reasoning core, a handful of skills<\/h2>\n    <p>You talk to it over chat. The training jobs report in as they run. One reasoning core in the middle decides what to say, what to do, and what to hold back until a human says yes.<\/p>\n  <\/div>\n\n  <div class=\"arch-wrap\">\n    <div class=\"arch-header\">\n      <img decoding=\"async\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iNzYwIiBoZWlnaHQ9IjU2NiIgdmlld0JveD0iMCAwIDc2MCA1NjYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjM4MC44NDMiIGN5PSIyODIuODQzIiByPSIyMDAiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDM4MC44NDMgMjgyLjg0MykiIGZpbGw9ImJsYWNrIj48L2NpcmNsZT4KPHBhdGggZD0iTTMwOC4xNzUgMjY5LjQ4NUwyOTguOTQyIDI2MC4yNTJMMzU3LjM0NiAyMDEuODQ3TDM2Ni41NzkgMjExLjA4TDMwOC4xNzUgMjY5LjQ4NVoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik00MDIuODI4IDM2NC4xMzhMMzkzLjU5NSAzNTQuOTA1TDQ1MiAyOTYuNUw0NjEuMjMzIDMwNS43MzNMNDAyLjgyOCAzNjQuMTM4WiIgZmlsbD0id2hpdGUiPjwvcGF0aD4KPHBhdGggZD0iTTMyMC44MDIgMjIzLjczMkMzMzcuOTI2IDIwNi42MDggMzM3LjU1IDE3OS42NDkgMzIwLjYyNyAxNjIuNzI2QzMwMy40ODUgMTQ1LjU4NCAyNzYuNzU3IDE0NS40MzkgMjU5LjYzNCAxNjIuNTYzQzI0Mi41MSAxNzkuNjg3IDI0Mi44OTggMjA2LjQxNSAyNTkuNjg3IDIyMy40NDdDMjY4LjA3IDIzMS44MyAyNzguODc2IDIzNi4xMzYgMjg5LjcyOCAyMzYuMzRMMjgyLjM2NyAyNDMuNzAxTDI5MS42IDI1Mi45MzRMMzIwLjgwMiAyMjMuNzMyWk0yNjguMjAxIDIxNC45MzRDMjU2LjA4OCAyMDIuODIyIDI1Ni42NjcgMTg0LjQ4MiAyNjkgMTcyLjE0OEMyODEuMzIxIDE1OS41ODQgMjk5Ljg5MiAxNTguOTk0IDMxMi4xMjYgMTcxLjIyN0MzMjQuMTE2IDE4My4yMTggMzIzLjc4MSAyMDEuODAxIDMxMS4yMDUgMjE0LjM3N0MyOTkuMDA1IDIyNi41NzcgMjgwLjMxMyAyMjcuMDQ2IDI2OC4yMDEgMjE0LjkzNFoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik01MDAuMDQgMzQyLjEzOUM0ODMuMTI5IDMyNS4yMjggNDU2LjE3IDMyNC44NTIgNDM5LjA0NyAzNDEuOTc2TDQwOS44NTYgMzcxLjE2Nkw0MTkuMDg5IDM4MC4zOTlMNDI2LjQ1MSAzNzMuMDM4QzQyNi42NTQgMzgzLjg4OSA0MzAuOTYxIDM5NC42OTYgNDM5LjM0MyA0MDMuMDc4QzQ1Ni4zNzYgNDE5Ljg2OCA0ODMuMTA0IDQyMC4yNTYgNTAwLjIyNyA0MDMuMTMyQzUxNy4zMjcgMzg2LjAwOSA1MTcuMTk0IDM1OS4yOTMgNTAwLjA0IDM0Mi4xMzlaTTQ0Ny44NDUgMzk0LjU3N0M0MzUuNzMyIDM4Mi40NjUgNDM2LjIwMSAzNjMuNzczIDQ0OC40MTMgMzUxLjU2MUM0NjAuOTg5IDMzOC45ODUgNDc5LjU2IDMzOC42MzcgNDkxLjU2MyAzNTAuNjRDNTAzLjc5NyAzNjIuODc0IDUwMy4yMDYgMzgxLjQ0NCA0OTAuNjQyIDM5My43OUM0NzguMjk3IDQwNi4xMTEgNDU5Ljk1NyA0MDYuNjg5IDQ0Ny44NDUgMzk0LjU3N1oiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik00NDYuMjM1IDI4OS43NzlMNDMzLjQ2NSAyNzYuNTYzTDM4Ny41MTIgMjc2LjUxTDM4Ny41NjYgMjE3LjM1M0wzNzQuMjU1IDIxNy4zNTNMMzc0LjMwNyAyNzYuNTExTDMxNS4xNSAyNzYuNDU5TDMxNS4xNSAyODkuNjY0TDM3NC4zMTkgMjg5LjcwM0wzNzQuNDU1IDM0OC44ODVMMzg3LjU3NiAzNDguODg1TDM4Ny41MjQgMjg5LjcyN0w0NDYuMjM1IDI4OS43NzlaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNMzc0LjQ1NSAzNDguMDY5TDM4Ny41MTUgMzM1LjAwOUwzODcuNTY3IDI4OS42MDFMNDQ2LjIzNSAyODkuNzc5TDQ0Ni4wMjMgMjc2LjUwMUwzODcuNTY2IDI3Ni41NTNMMzg3LjU2NiAyMTcuMzUzTDM3NC41NTggMjMxLjE1NkwzNzQuNTMgMjc2LjU2NEwzMjkuMTEgMjc2LjYwNEwzMTUuMTUgMjg5LjY2NEwzNzQuNTA2IDI4OS42MTJMMzc0LjQ1NSAzNDguMDY5WiIgZmlsbD0id2hpdGUiPjwvcGF0aD4KPHBhdGggZD0iTTM5My4zNjEgMjEwLjk1Nkw0MDIuNTk0IDIwMS43MjNMNDYwLjk5OSAyNjAuMTI4TDQ1MS43NjYgMjY5LjM2MUwzOTMuMzYxIDIxMC45NTZaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNMjk4LjcwOCAzMDUuNjA5TDMwNy45NDEgMjk2LjM3NkwzNjYuMzQ2IDM1NC43ODFMMzU3LjExMyAzNjQuMDE0TDI5OC43MDggMzA1LjYwOVoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik00MzkuMTE0IDIyMy41ODNDNDU2LjIzOCAyNDAuNzA3IDQ4My4xOTcgMjQwLjMzMSA1MDAuMTIgMjIzLjQwOEM1MTcuMjYyIDIwNi4yNjYgNTE3LjQwNyAxNzkuNTM4IDUwMC4yODMgMTYyLjQxNUM0ODMuMTU5IDE0NS4yOTEgNDU2LjQzMSAxNDUuNjc5IDQzOS4zOTkgMTYyLjQ2OUM0MzEuMDE2IDE3MC44NTEgNDI2LjcxIDE4MS42NTggNDI2LjUwNiAxOTIuNTA5TDQxOS4xNDUgMTg1LjE0OEw0MDkuOTEyIDE5NC4zODFMNDM5LjExNCAyMjMuNTgzWk00NDcuOTEyIDE3MC45ODJDNDYwLjAyNSAxNTguODcgNDc4LjM2NCAxNTkuNDQ4IDQ5MC42OTggMTcxLjc4MkM1MDMuMjYyIDE4NC4xMDMgNTAzLjg1MiAyMDIuNjczIDQ5MS42MTkgMjE0LjkwN0M0NzkuNjI4IDIyNi44OTggNDYxLjA0NSAyMjYuNTYyIDQ0OC40NjkgMjEzLjk4NkM0MzYuMjY5IDIwMS43ODYgNDM1LjggMTgzLjA5NCA0NDcuOTEyIDE3MC45ODJaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNMzIwLjcwNyA0MDIuODIxQzMzNy42MTggMzg1LjkxIDMzNy45OTQgMzU4Ljk1MSAzMjAuODcgMzQxLjgyOEwyOTEuNjggMzEyLjYzN0wyODIuNDQ3IDMyMS44N0wyODkuODA4IDMyOS4yMzJDMjc4Ljk1NyAzMjkuNDM1IDI2OC4xNSAzMzMuNzQyIDI1OS43NjcgMzQyLjEyNEMyNDIuOTc4IDM1OS4xNTcgMjQyLjU5IDM4NS44ODUgMjU5LjcxNCA0MDMuMDA4QzI3Ni44MzcgNDIwLjEwOCAzMDMuNTUzIDQxOS45NzUgMzIwLjcwNyA0MDIuODIxWk0yNjguMjY5IDM1MC42MjZDMjgwLjM4MSAzMzguNTEzIDI5OS4wNzMgMzM4Ljk4MiAzMTEuMjg1IDM1MS4xOTVDMzIzLjg2MSAzNjMuNzcgMzI0LjIwOSAzODIuMzQxIDMxMi4yMDYgMzk0LjM0NEMyOTkuOTcyIDQwNi41NzggMjgxLjQwMSA0MDUuOTg3IDI2OS4wNTYgMzkzLjQyM0MyNTYuNzM1IDM4MS4wNzggMjU2LjE1NiAzNjIuNzM4IDI2OC4yNjkgMzUwLjYyNloiIGZpbGw9IndoaXRlIj48L3BhdGg+Cjwvc3ZnPg==\" alt=\"\" style=\"height:14px;width:auto;\">\n      <span class=\"arch-title\">mlops-agent \u00b7 system architecture<\/span>\n    <\/div>\n    <div class=\"arch-canvas\">\n\n      <div class=\"diag-node user\">User \u00b7 Chat<\/div>\n\n      <div class=\"arrow-line\"><\/div>\n      <span class=\"arrow-tag\">chat in \/ notifications out<\/span>\n\n      <div class=\"diag-node agent\">\n        <div class=\"agent-label\">MLOps Agent<\/div>\n        <div class=\"agent-inner\">\n          <div class=\"agent-chip\"><span class=\"cdot\"><\/span> Chat bridge<\/div>\n          <div class=\"agent-chip\"><span class=\"cdot ink\"><\/span> Reasoning core (self-hosted model)<\/div>\n          <div class=\"agent-chip\"><span class=\"cdot\"><\/span> Event intake<\/div>\n          <div class=\"agent-chip\"><span class=\"cdot ink\"><\/span> Skill router<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"arrow-line\"><\/div>\n\n      <div class=\"leaves-row\">\n        <div class=\"leaf-col\">\n          <span class=\"leaf-tag\">drives<\/span>\n          <div class=\"arrow-line\"><\/div>\n          <div class=\"diag-node leaf blue\">AiQu (GPUs)<\/div>\n          <div class=\"leaf-sub\">training jobs<br>report events + metrics<\/div>\n        <\/div>\n        <div class=\"leaf-col\">\n          <span class=\"leaf-tag\">reads<\/span>\n          <div class=\"arrow-line\"><\/div>\n          <div class=\"diag-node leaf blue\">MLflow<\/div>\n          <div class=\"leaf-sub\">runs \/ metrics<br>experiment history<\/div>\n        <\/div>\n        <div class=\"leaf-col\">\n          <span class=\"leaf-tag\">checks<\/span>\n          <div class=\"arrow-line\"><\/div>\n          <div class=\"diag-node leaf\">Dataset store<\/div>\n          <div class=\"leaf-sub\">labels + versions<br>read-only access<\/div>\n        <\/div>\n      <\/div>\n\n    <\/div>\n  <\/div>\n\n  <p>It reaches the outside world through <em>skills<\/em>. Each system it touches sits behind a skill \u2014 a self-contained capability the core invokes by name. AiQu, the metrics store, and the dataset store each have one. Adding a new system means writing a new skill, not rewiring the agent.<\/p>\n\n  <hr class=\"divider\">\n\n  <!-- DUMB PLUMBING -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">Design<\/p>\n    <h2>Dumb plumbing, smart prompt<\/h2>\n    <p>The most important decision in the system looks like the most boring one. The part that receives a training event does almost nothing. It hands the event to the reasoning core.<\/p>\n    <p>No rule like \u201cif the event is an error, notify\u201d lives in the code. Whether to notify, how to phrase it, when to stay quiet \u2014 all of that lives in the agent's written instructions.<\/p>\n  <\/div>\n\n  <div class=\"callout blue\">\n    <p class=\"callout-head\">Design principle<\/p>\n    <p>Push your judgment into the instructions and keep the code mechanical. The code moves bytes. The model makes the decisions.<\/p>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- SILENCE -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">Notifications<\/p>\n    <h2>Let the agent choose silence<\/h2>\n    <p>Most notification systems fail by talking too much. A bot that pings you every epoch is a bot you mute. So we wrote silence into its instructions as an explicit rule: when an epoch update isn't worth sending, say nothing at all.<\/p>\n    <p>The agent earns the right to interrupt you. It always speaks on errors, on finished jobs, and on real milestones \u2014 and says nothing the rest of the time.<\/p>\n  <\/div>\n\n  <!-- CHAT MOCK 1 -->\n  <div class=\"chat-wrap\">\n    <div class=\"chat-phone\">\n      <div class=\"chat-header\">\n        <div class=\"chat-avatar\"><img decoding=\"async\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iNTM1IiBoZWlnaHQ9IjEzNiIgdmlld0JveD0iMCAwIDUzNSAxMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNzIuNTQzIDEzMi4zMDhIMTUyLjA0OFYyLjY2NTA0SDE3Mi41NDNWMTMyLjMwOFoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik0zODIuNjQ4IDEzMi4zMDhIMzYyLjE1M1YyLjY2NTA0SDM4Mi42NDhWMTMyLjMwOFoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik0xMzUuNzc4IDY3LjUxMzVDMTM1Ljc3OCAyOS41MDM1IDEwNS40NCAwIDY3Ljg3NTYgMEMyOS44MjUzIDAgMCAyOS41MDM1IDAgNjcuNTEzNUMwIDEwNS41MjMgMzAuMDk1IDEzNC43NTggNjcuNjMyOSAxMzUuMDI3Qzg2LjI0IDEzNS4wMjcgMTAzLjAxMyAxMjcuODEzIDExNS4yODMgMTE1Ljk5NVYxMzIuMzM1SDEzNS43NzhWNjcuNTEzNVpNNjcuNjMyOSAxMTYuMTNDNDAuNzQ2OSAxMTYuMTMgMjEuMDM0MSA5NS4xMzI2IDIxLjAzNDEgNjcuNzU1N0MyMC43NjQ1IDQwLjEzNjYgNDAuNzE5OSAxOC44NzA0IDY3Ljg3NTYgMTguODcwNEM5NC40OTE4IDE4Ljg3MDQgMTE0Ljc0NCAzOS44Njc0IDExNC43NDQgNjcuNzgyNkMxMTQuNzQ0IDk0Ljg2MzQgOTQuNTE4OCAxMTYuMTMgNjcuNjMyOSAxMTYuMTNaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNNDY2LjEyNSAwQzQyOC41ODcgMCAzOTguMjQ5IDI5LjUwMzUgMzk4LjI0OSA2Ny41MTM1VjEzMi4zMDhINDE4Ljc0NFYxMTUuOTY4QzQzMS4wMTQgMTI3Ljc4NiA0NDcuNzg3IDEzNSA0NjYuMzk0IDEzNUM1MDMuOTMyIDEzNC43MzEgNTM0LjAyNyAxMDUuNDk3IDUzNC4wMjcgNjcuNDg2NUM1MzQgMjkuNTAzNSA1MDQuMjAyIDAgNDY2LjEyNSAwWk00NjYuMzk0IDExNi4xM0M0MzkuNTA4IDExNi4xMyA0MTkuMjgzIDk0Ljg2MzQgNDE5LjI4MyA2Ny43NTU3QzQxOS4yODMgMzkuODQwNSA0MzkuNTA4IDE4Ljg0MzUgNDY2LjE1MiAxOC44NDM1QzQ5My4zMDcgMTguODQzNSA1MTMuMjYzIDQwLjEwOTcgNTEzLjAyIDY3Ljc1NTdDNTEyLjk5MyA5NS4xMzI2IDQ5My4yOCAxMTYuMTMgNDY2LjM5NCAxMTYuMTNaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNMzQ2Ljg4NiAyLjY2NTA0SDMxNy44OTdMMjY3LjQ0MiA1My4wMDRMMjE3LjAxNCAyLjY2NTA0SDE4OC4wMjRMMjUyLjk2MSA2Ny40ODY2TDE4OC4wMjQgMTMyLjMwOEgyMTcuMDE0TDI2Ny40NDIgODEuOTQyMkwzMTcuODk3IDEzMi4zMDhIMzQ2Ljg4NkwyODEuOTUgNjcuNDg2NkwzNDYuODg2IDIuNjY1MDRaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8L3N2Zz4=\" alt=\"\"><\/div>\n        <div>\n          <div class=\"chat-name\">MLOps Agent<\/div>\n          <div class=\"chat-status\">online<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"chat-messages\">\n        <div class=\"chat-date\">Today<\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          <span class=\"badge info\">Started<\/span><br>\n          <strong>customer-a\/weld-defect-v4<\/strong><br>\n          Epoch 1\/60 \u00b7 2\u00d7 DGX H100 \u00b7 batch 128<br>\n          Dataset: 14 820 samples\n          <div class=\"time\">08:14<\/div>\n        <\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          <span class=\"badge ok\">25% milestone<\/span><br>\n          <strong>customer-a\/weld-defect-v4<\/strong> \u2014 epoch 15\/60\n          <div class=\"metric\">\n            <span class=\"k\">val_loss<\/span>&nbsp;&nbsp;<span class=\"vb\">0.0842<\/span> \u2193 from 0.1104<br>\n            <span class=\"k\">mAP@0.5<\/span>&nbsp;&nbsp;<span class=\"vb\">0.874<\/span> \u2191 new best<br>\n            <span class=\"k\">lr<\/span>&nbsp;&nbsp;<span class=\"v\">3.2e-4<\/span><br>\n            <span class=\"k\">eta<\/span>&nbsp;&nbsp;~2 h 40 min\n          <\/div>\n          <div class=\"time\">10:47<\/div>\n        <\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          <span class=\"badge ink\">Crashed<\/span><br>\n          <strong>customer-b\/pcb-inspect-v2<\/strong> \u2014 epoch 12<br>\n          <code>RuntimeError: CUDA OOM \u2014 batch 64 on 80 GB<\/code><br><br>\n          Likely cause: image_size mismatch in config (1280 vs 640). Recommend fixing <code>train_cfg.yaml<\/code> before requeue.\n          <div class=\"time\">11:23<\/div>\n        <\/div>\n\n        <div class=\"bubble out\">\n          fix the image size and requeue\n          <div class=\"time\">11:26 <span class=\"ticks\">\u2713\u2713<\/span><\/div>\n        <\/div>\n\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- HUMAN AT EVERY WRITE -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">Safety<\/p>\n    <h2>Put a human at every write<\/h2>\n    <p>The agent holds read and write access to our training repos. It can edit configs, commit, and push. That access earns its keep \u2014 but it's the kind of capability that should make you nervous.<\/p>\n    <p>What keeps it safe is a hard split between reading and changing. The agent runs read-only checks on its own. The confirmation rule covers changes only.<\/p>\n  <\/div>\n\n  <div class=\"protocol\">\n    <p class=\"protocol-head\">Write protocol \u2014 enforced per turn<\/p>\n    <ol>\n      <li>Plan the change.<\/li>\n      <li>Describe it to the user \u2014 <strong>what file, what change, why.<\/strong><\/li>\n      <li><strong>End the turn without making the change.<\/strong><\/li>\n      <li>Wait for explicit confirmation: <strong>\u201cyes \/ go ahead \/ k\u00f6r p\u00e5\u201d.<\/strong><\/li>\n      <li>Only then perform the change.<\/li>\n    <\/ol>\n  <\/div>\n\n  <p>The subtle part: the proposal and the action cannot share a turn. The gate is structural, not a polite request in the instructions.<\/p>\n\n  <!-- CHAT MOCK 2 -->\n  <div class=\"chat-wrap\">\n    <div class=\"chat-phone\">\n      <div class=\"chat-header\">\n        <div class=\"chat-avatar\"><img decoding=\"async\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iNTM1IiBoZWlnaHQ9IjEzNiIgdmlld0JveD0iMCAwIDUzNSAxMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNzIuNTQzIDEzMi4zMDhIMTUyLjA0OFYyLjY2NTA0SDE3Mi41NDNWMTMyLjMwOFoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik0zODIuNjQ4IDEzMi4zMDhIMzYyLjE1M1YyLjY2NTA0SDM4Mi42NDhWMTMyLjMwOFoiIGZpbGw9IndoaXRlIj48L3BhdGg+CjxwYXRoIGQ9Ik0xMzUuNzc4IDY3LjUxMzVDMTM1Ljc3OCAyOS41MDM1IDEwNS40NCAwIDY3Ljg3NTYgMEMyOS44MjUzIDAgMCAyOS41MDM1IDAgNjcuNTEzNUMwIDEwNS41MjMgMzAuMDk1IDEzNC43NTggNjcuNjMyOSAxMzUuMDI3Qzg2LjI0IDEzNS4wMjcgMTAzLjAxMyAxMjcuODEzIDExNS4yODMgMTE1Ljk5NVYxMzIuMzM1SDEzNS43NzhWNjcuNTEzNVpNNjcuNjMyOSAxMTYuMTNDNDAuNzQ2OSAxMTYuMTMgMjEuMDM0MSA5NS4xMzI2IDIxLjAzNDEgNjcuNzU1N0MyMC43NjQ1IDQwLjEzNjYgNDAuNzE5OSAxOC44NzA0IDY3Ljg3NTYgMTguODcwNEM5NC40OTE4IDE4Ljg3MDQgMTE0Ljc0NCAzOS44Njc0IDExNC43NDQgNjcuNzgyNkMxMTQuNzQ0IDk0Ljg2MzQgOTQuNTE4OCAxMTYuMTMgNjcuNjMyOSAxMTYuMTNaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNNDY2LjEyNSAwQzQyOC41ODcgMCAzOTguMjQ5IDI5LjUwMzUgMzk4LjI0OSA2Ny41MTM1VjEzMi4zMDhINDE4Ljc0NFYxMTUuOTY4QzQzMS4wMTQgMTI3Ljc4NiA0NDcuNzg3IDEzNSA0NjYuMzk0IDEzNUM1MDMuOTMyIDEzNC43MzEgNTM0LjAyNyAxMDUuNDk3IDUzNC4wMjcgNjcuNDg2NUM1MzQgMjkuNTAzNSA1MDQuMjAyIDAgNDY2LjEyNSAwWk00NjYuMzk0IDExNi4xM0M0MzkuNTA4IDExNi4xMyA0MTkuMjgzIDk0Ljg2MzQgNDE5LjI4MyA2Ny43NTU3QzQxOS4yODMgMzkuODQwNSA0MzkuNTA4IDE4Ljg0MzUgNDY2LjE1MiAxOC44NDM1QzQ5My4zMDcgMTguODQzNSA1MTMuMjYzIDQwLjEwOTcgNTEzLjAyIDY3Ljc1NTdDNTEyLjk5MyA5NS4xMzI2IDQ5My4yOCAxMTYuMTMgNDY2LjM5NCAxMTYuMTNaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8cGF0aCBkPSJNMzQ2Ljg4NiAyLjY2NTA0SDMxNy44OTdMMjY3LjQ0MiA1My4wMDRMMjE3LjAxNCAyLjY2NTA0SDE4OC4wMjRMMjUyLjk2MSA2Ny40ODY2TDE4OC4wMjQgMTMyLjMwOEgyMTcuMDE0TDI2Ny40NDIgODEuOTQyMkwzMTcuODk3IDEzMi4zMDhIMzQ2Ljg4NkwyODEuOTUgNjcuNDg2NkwzNDYuODg2IDIuNjY1MDRaIiBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgo8L3N2Zz4=\" alt=\"\"><\/div>\n        <div>\n          <div class=\"chat-name\">MLOps Agent<\/div>\n          <div class=\"chat-status\">online<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"chat-messages\">\n        <div class=\"chat-date\">Today<\/div>\n\n        <div class=\"bubble out\">\n          fix the image size and requeue customer-b\/pcb-inspect-v2\n          <div class=\"time\">11:26 <span class=\"ticks\">\u2713\u2713<\/span><\/div>\n        <\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          Read <code>configs\/...\/train_cfg.yaml<\/code> and cross-checked with MLflow run <code>r-4f92a1<\/code>.<br><br>\n          Found: <code>image_size: 1280<\/code> \u2014 model head was compiled for 640. Caused OOM at epoch 12.\n          <div class=\"time\">11:26<\/div>\n        <\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          <span class=\"badge line\">Proposed change<\/span><br>\n          I will make one edit and commit:\n          <div class=\"filediff\">\n            <span class=\"path\">configs\/customer-b\/pcb-inspect-v2\/train_cfg.yaml<\/span><br>\n            <span class=\"rem\">- image_size: 1280<\/span><br>\n            <span class=\"add\">+ image_size: 640<\/span>\n          <\/div>\n          Then requeue the job on 2\u00d7 DGX H100.<br><br>\n          <strong>Waiting for your go-ahead.<\/strong> Type <em>k\u00f6r p\u00e5<\/em> to confirm.\n          <div class=\"time\">11:26<\/div>\n        <\/div>\n\n        <div class=\"bubble out\">\n          k\u00f6r p\u00e5\n          <div class=\"time\">11:28 <span class=\"ticks\">\u2713\u2713<\/span><\/div>\n        <\/div>\n\n        <div class=\"bubble in\">\n          <div class=\"sender\">MLOps Agent<\/div>\n          <span class=\"badge ok\">Done<\/span><br>\n          Committed <code>fix: image_size 1280\u2192640 pcb-inspect-v2<\/code><br>\n          Job requeued \u2014 run ID <code>r-7c03b8<\/code> \u00b7 starting in ~4 min.<br>\n          Will notify on first milestone or error.\n          <div class=\"time\">11:28<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- OVERNIGHT -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">Autonomy<\/p>\n    <h2>Let it run the loop while you sleep<\/h2>\n    <p>The write gate covers the code. The experiment loop is different work, and the agent owns most of it. While you sleep, it runs a hyperparameter sweep, evaluates each model that falls out of it, starts the next training run, and early-stops a run once the metric flattens.<\/p>\n  <\/div>\n\n  <div class=\"callout blue\">\n    <p class=\"callout-head\">The boundary runs along reversibility<\/p>\n    <p>Submitting a tuning job spends a few GPU hours and leaves the repo untouched. Editing a config and pushing it changes what every future run does. Give your agent the actions you can undo and keep the rest behind a human.<\/p>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- BOUNDARIES -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">Security<\/p>\n    <h2>Stack boring boundaries on the edges<\/h2>\n    <p>The agent answers a known list of senders and ignores everyone else \u2014 a stranger who finds the bot gets nowhere before the agent spends a single token. The channel the training jobs report on carries a shared secret. The agent pushes with one deploy key whose scope is controlled outside the agent.<\/p>\n  <\/div>\n\n  <div class=\"callout\">\n    <p class=\"callout-head\">None of these are clever \u2014 which is the point<\/p>\n    <p>Auth at the door, a secret on the wire, least privilege on the credentials. Stacked plain boundaries let you sleep while an agent runs.<\/p>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <!-- SUMMARY -->\n  <div class=\"sec\">\n    <p class=\"sec-eyebrow\">In summary<\/p>\n    <h2>What it adds up to<\/h2>\n    <p>Stack these choices and you get an agent with a clear character. It runs on hardware we own, so it can hold sensitive data. Its behaviour lives in prose, so anyone on the team can tune it. It picks silence, so the things it says repay the read. It reads on its own and never writes without a human, so it helps without scaring us. Its model is a swappable part, so it ages well.<\/p>\n    <p>Building your first agent to leave running next to systems that matter? Reach for these dials first. Run it local. Push judgment into the instructions and keep the code dumb. Give it a way to say nothing. Put a human at every write. Treat the model as the most replaceable part you have \u2014 because it is.<\/p>\n    <p class=\"closing-note\">The dashboard still exists. We stopped watching it.<\/p>\n  <\/div>\n\n  <hr class=\"divider\">\n\n  <p class=\"colophon\">The agent wraps <a href=\"https:\/\/opencode.ai\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">opencode<\/a>, runs as one self-contained service, and takes its orders from a written brief. The boundaries above come from that brief and the shape of the container. No magic \u2014 only lines drawn on purpose.<\/p>\n\n<\/article>\n\n<!-- Footer removed \u2014 embeds into the existing aixia.se site footer -->\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We built an encapsulated, self-hosted AI agent that sits between our GPU training jobs and a chat. This is how it works \u2014 and what it taught us about agents [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":121692,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[115],"tags":[],"class_list":["post-121689","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-insights"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/posts\/121689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/comments?post=121689"}],"version-history":[{"count":14,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/posts\/121689\/revisions"}],"predecessor-version":[{"id":121715,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/posts\/121689\/revisions\/121715"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/media\/121692"}],"wp:attachment":[{"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/media?parent=121689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/categories?post=121689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aixia.se\/en\/wp-json\/wp\/v2\/tags?post=121689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}