This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 9bce9fb48fe6 Blog + homepage: Meet Horizon UI — The AI Assistant (EN + 
CN) (#886)
9bce9fb48fe6 is described below

commit 9bce9fb48fe61be572735374f1222e21ad3ca5c3
Author: 吴晟 Wu Sheng <[email protected]>
AuthorDate: Mon Jul 6 12:35:30 2026 +0800

    Blog + homepage: Meet Horizon UI — The AI Assistant (EN + CN) (#886)
---
 assets/scss/_custom_home.scss                      |  76 ++++++++++++++++
 content/_index.html                                |  82 +++++++++++++----
 .../2026-07-06-horizon-ui-ai-assistant/index.md    |  96 ++++++++++++++++++++
 content/images/home/horizon-ai-assistant.mp4       | Bin 0 -> 1225284 bytes
 content/images/home/horizon-ai-assistant.png       | Bin 0 -> 294368 bytes
 .../zh/2026-07-06-horizon-ui-ai-assistant/index.md |  98 +++++++++++++++++++++
 layouts/shortcodes/video.html                      |  16 ++++
 .../screenshots/horizon-1.0/CAPTURE-CHECKLIST.md   |  41 +++++++++
 .../horizon-1.0/ai-00-investigation-poster.webp    | Bin 0 -> 62134 bytes
 .../horizon-1.0/ai-00-investigation.mp4            | Bin 0 -> 1225284 bytes
 static/screenshots/horizon-1.0/ai-01-topology.webp | Bin 0 -> 55072 bytes
 .../horizon-1.0/ai-02-catalog-grounded.webp        | Bin 0 -> 67676 bytes
 static/screenshots/horizon-1.0/ai-03-summary.webp  | Bin 0 -> 81278 bytes
 13 files changed, 394 insertions(+), 15 deletions(-)

diff --git a/assets/scss/_custom_home.scss b/assets/scss/_custom_home.scss
index 44a7ff7f57a0..f197df8cf9d0 100644
--- a/assets/scss/_custom_home.scss
+++ b/assets/scss/_custom_home.scss
@@ -294,6 +294,78 @@ $brand-grad: linear-gradient(180deg, #479EEB 0%, #3788D0 
100%);
   }
 
 
+  // ---------- HIGHLIGHT FEATURE ROWS (AI Assistant + 3D map, zigzag) 
----------
+  // Two flagship "experience" features presented as alternating media/copy 
rows.
+  .feature-rows {
+    .frow {
+      display: grid; grid-template-columns: 1fr 1fr; gap: 52px; align-items: 
start;
+    }
+    .frow + .frow { margin-top: 80px; }
+    // alternate: reversed rows put the media on the right, copy on the left,
+    // and center the copy against the taller 3D stage
+    .frow--reverse { align-items: center; }
+    .frow--reverse .frow-media { order: 2; }
+
+    .frow-media {
+      margin: 0; min-width: 0;   // allow the framed shot / 3D stage to shrink 
in its cell
+      display: flex; flex-direction: column; gap: 16px;   // stack the framed 
capture + BYO callout
+      // framed AI capture (video, or its poster) inside a row cell
+      .hero-shot img,
+      .hero-shot video { display: block; width: 100%; height: auto; 
max-height: 440px; object-fit: contain; background: #0f131a; }
+      // the 3D map stage is centered + width-capped globally; fill the cell 
here
+      .map3d-stage { max-width: 100%; }
+    }
+
+    .frow-copy {
+      .eyebrow { margin-bottom: 12px; }
+      h2 { font-size: 30px; font-weight: 700; color: $ink; border: 0; padding: 
0;
+           margin: 0 0 14px; line-height: 1.22; }
+      > p { font-size: 16px; color: $body; line-height: 1.65; margin: 0 0 
20px; }
+    }
+
+    // compact feature list in the copy column
+    .frow-points {
+      list-style: none; margin: 0 0 20px; padding: 0; display: grid; gap: 14px;
+      li {
+        display: flex; gap: 12px; align-items: flex-start;
+        font-size: 14.5px; color: $body; line-height: 1.55;
+        strong { color: $ink; font-weight: 700; }
+      }
+      // meaning-bearing glyph in a brand chip — chart / magnifier / shield,
+      // one per point so the icon reinforces the words
+      .fp-ic {
+        flex: 0 0 auto; margin-top: 1px;
+        width: 26px; height: 26px; border-radius: 7px;
+        display: grid; place-items: center;
+        color: #fff; background: $brand-grad;
+        box-shadow: 0 3px 8px rgba(55, 136, 208, .3);
+        svg { width: 15px; height: 15px; display: block; }
+      }
+    }
+
+    .frow-cta { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 4px; }
+  }
+
+  // "bring your own LLM" callout — the cost / vendor-neutral message (under 
the AI video)
+  .ai-byo {
+    margin: 0;
+    display: flex; align-items: flex-start; gap: 14px; flex-wrap: wrap;
+    border: 1px solid #d6e4f5; border-radius: 12px;
+    background: radial-gradient(130% 150% at 0% 0%, #f2f8ff 0%, #fff 62%);
+    padding: 15px 17px;
+    .ai-byo-tag {
+      flex: 0 0 auto;
+      display: inline-flex; align-items: center; height: 24px; padding: 0 11px;
+      border-radius: 999px; font-size: 11.5px; font-weight: 700; 
letter-spacing: .02em;
+      color: #fff; background: $brand-grad; box-shadow: 0 4px 12px rgba(55, 
136, 208, .3);
+    }
+    p {
+      flex: 1 1 240px; margin: 0; font-size: 13.5px; color: $body; 
line-height: 1.6;
+      strong { color: $ink; }
+    }
+  }
+
+
   // ---------- ECOSYSTEM ----------
   .eco-grid {
     display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; 
margin-bottom: 36px;
@@ -446,6 +518,10 @@ $brand-grad: linear-gradient(180deg, #479EEB 0%, #3788D0 
100%);
     .home-hero-text h1 { font-size: 42px; }
     .cap-grid { grid-template-columns: 1fr 1fr; }
     .eco-grid { grid-template-columns: 1fr 1fr; }
+    // stack the zigzag rows; always show the media on top when stacked
+    .feature-rows .frow { grid-template-columns: 1fr; gap: 28px; }
+    .feature-rows .frow + .frow { margin-top: 52px; }
+    .feature-rows .frow--reverse .frow-media { order: 0; }
     .community-cards { grid-template-columns: 1fr; }
     .widget-card { flex-basis: 45%; min-height: 220px; }
   }
diff --git a/content/_index.html b/content/_index.html
index f4e709dc22ee..5a66436d4dc7 100644
--- a/content/_index.html
+++ b/content/_index.html
@@ -88,6 +88,73 @@ linkTitle = "Apache SkyWalking"
 </section>
 
 <div class="home-below">
+<!-- ===== HIGHLIGHTS: AI Assistant + 3D map (alternating rows) =====
+     AI Assistant ships with Horizon UI 1.0 (feature is merged to main).
+     Media: horizon-ai-assistant.mp4 (a 3x screen capture); 
horizon-ai-assistant.png is its
+     click-to-play poster still. "AI Assistant docs" -> /next/ operate doc (on 
main); "Meet
+     Horizon UI" -> the AI-assistant announcement post (draft: true until the 
1.0 launch). -->
+<section class="home-section feature-rows">
+  <div class="container">
+
+    <!-- Row 1 · AI Assistant — video + BYO callout on the left, copy on the 
right -->
+    <div class="frow">
+      <div class="frow-media">
+        <figure class="hero-shot ai-shot">
+          <span class="shot-bar"><i></i><i></i><i></i><em>horizon · AI 
Assistant</em></span>
+          <video class="ai-video" 
poster="/images/home/horizon-ai-assistant.png"
+                 controls muted loop playsinline preload="none"
+                 aria-label="Horizon AI Assistant investigating latency — 
replies with inline charts and a service-dependency topology">
+            <source src="/images/home/horizon-ai-assistant.mp4" 
type="video/mp4">
+          </video>
+        </figure>
+        <div class="ai-byo">
+          <span class="ai-byo-tag">Bring your own LLM</span>
+          <p><strong>No frontier model required.</strong> Vendor-neutral — any 
OpenAI-compatible endpoint or Amazon Bedrock — and runs efficiently on a 
cost-effective model like <strong>DeepSeek</strong> or a mid-tier 
<strong>Claude Sonnet</strong>. The observability know-how lives in the tools, 
metric catalog and playbooks; the model orchestrates and narrates. Off by 
default.</p>
+        </div>
+      </div>
+      <div class="frow-copy">
+        <span class="eyebrow">NEW · AI ASSISTANT</span>
+        <h2>Ask your observability in plain language</h2>
+        <p>Horizon's built-in assistant answers questions about your running 
system — <em>"what's unhealthy right now?"</em>, <em>"investigate latency for 
checkout"</em> — and replies with an ordered narrative built from the 
<strong>same charts, topology and tables</strong> as the rest of the UI, not a 
wall of text.</p>
+        <ul class="frow-points">
+          <li>
+            <span class="fp-ic" aria-hidden="true"><svg viewBox="0 0 24 24" 
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" 
stroke-linejoin="round"><path d="M4 5v14a1 1 0 0 0 1 1h15"/><path d="M7.5 
14l3.5-4 3 2.5 4.5-6"/></svg></span>
+            <span><strong>Answers you can see.</strong> Inline charts, top-N 
lists, tables and a focused one-hop topology — drawn by the same widgets as the 
dashboards.</span>
+          </li>
+          <li>
+            <span class="fp-ic" aria-hidden="true"><svg viewBox="0 0 24 24" 
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" 
stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M20.5 
20.5l-4.2-4.2"/></svg></span>
+            <span><strong>Guided root-cause.</strong> Playbooks walk root 
service → calling chain → error stack, read live Kubernetes pod logs, and can 
propose a profiling task only you approve.</span>
+          </li>
+          <li>
+            <span class="fp-ic" aria-hidden="true"><svg viewBox="0 0 24 24" 
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" 
stroke-linejoin="round"><path d="M12 3l7 3v5c0 4.4-3 7.6-7 
9-4-1.4-7-4.6-7-9V6l7-3z"/><path d="M9 12l2 2 4-4"/></svg></span>
+            <span><strong>Read-only, your permissions.</strong> Every action 
re-checks a read verb you already hold — it never sees more than you can, and 
never edits anything.</span>
+          </li>
+        </ul>
+        <div class="frow-cta">
+          <a class="sky-btn primary" 
href="/docs/skywalking-horizon-ui/next/operate/ai-assistant/">AI Assistant docs 
<i class="iconfont icon-arrow-right"></i></a>
+          <a class="sky-btn" 
href="/blog/2026-07-06-horizon-ui-ai-assistant/">Meet Horizon UI</a>
+        </div>
+      </div>
+    </div>
+
+    <!-- Row 2 · 3D map — copy left, media right (alternating) -->
+    <div class="frow frow--reverse">
+      <figure class="frow-media">
+        {{< map3d poster="/images/home/horizon-3d-map.png" badge="Interactive 
· sample data" >}}
+      </figure>
+      <div class="frow-copy">
+        <span class="eyebrow">SEE IT IN 3D</span>
+        <h2>Explore your topology in 3D</h2>
+        <p>Walk your services and cloud-native infrastructure as a living 3D 
scene — orbit, zoom and click any node to inspect it. It opens as a full page 
and runs entirely in your browser from a frozen demo snapshot: no server, no 
login, no setup.</p>
+        <div class="frow-cta">
+          <a class="sky-btn primary" href="/3d-map-app/">Open the 3D map <span 
class="hint">full page</span></a>
+        </div>
+      </div>
+    </div>
+
+  </div>
+</section>
+
 <!-- ===== CAPABILITIES ===== -->
 <section class="home-section">
   <div class="container">
@@ -125,21 +192,6 @@ linkTitle = "Apache SkyWalking"
   </div>
 </section>
 
-<!-- ===== 3D INFRASTRUCTURE MAP ===== -->
-<section class="home-section map3d-band">
-  <div class="container">
-    <div class="section-head">
-      <span class="eyebrow">SEE IT IN 3D</span>
-      <h2>Explore your topology in 3D</h2>
-      <p>Walk your services and cloud-native infrastructure as a living 3D 
scene — orbit, zoom and click any node to inspect it. It opens as a full page 
and runs entirely in your browser from a frozen demo snapshot: no server, no 
login, no setup.</p>
-    </div>
-    {{< map3d poster="/images/home/horizon-3d-map.png" badge="Interactive · 
sample data" >}}
-    <div class="map3d-cta">
-      <a class="sky-btn primary" href="/3d-map-app/">Open the 3D map <span 
class="hint">full page</span></a>
-    </div>
-  </div>
-</section>
-
 <!-- ===== ECOSYSTEM ===== -->
 <section class="home-section ecosystem">
   <div class="container">
diff --git a/content/blog/2026-07-06-horizon-ui-ai-assistant/index.md 
b/content/blog/2026-07-06-horizon-ui-ai-assistant/index.md
new file mode 100644
index 000000000000..e7f39cc4ecbf
--- /dev/null
+++ b/content/blog/2026-07-06-horizon-ui-ai-assistant/index.md
@@ -0,0 +1,96 @@
+---
+title: "Meet Horizon UI · The AI Assistant: Ask Your Observability Data in 
Plain Language"
+date: 2026-07-06
+draft: true
+author: Sheng Wu
+description: "Horizon UI's new AI Assistant answers questions about your live 
system with the same charts, topology and tables as the UI — read-only, 
permission-scoped, and running on a cost-efficient model you bring yourself."
+tags:
+  - Release
+  - AI
+  - Cloud Native
+---
+
+The [**Meet Horizon 
UI**](/blog/2026-06-21-skywalking-horizon-ui-introduction/) series wrapped at 
17/17 — a full tour of every surface of SkyWalking's new console: the sidebar 
that mirrors your estate, the adaptive dashboards, topology and the 3D map, the 
trace and log explorers, profiling, alarms, the operations surface, access 
control, and config-driven customization. This is a new chapter, and it arrives 
with **Horizon UI 1.0**: an in-app **AI Assistant** that lets you *ask* your 
obse [...]
+
+It is not a chat box bolted onto a dashboard. Ask it something — *"what's 
unhealthy in the system right now?"*, *"investigate the response time for a 
service"* — and it reads **live data from your OAP backend, through the same 
query path the dashboards use**, then streams back an ordered narrative built 
from **the same charts, topology and tables** you see everywhere else in 
Horizon. It is **read-only**, it **inherits your permissions**, and it is **off 
by default** until an operator ena [...]
+
+{{< video src="/screenshots/horizon-1.0/ai-00-investigation.mp4" 
poster="/screenshots/horizon-1.0/ai-00-investigation-poster.webp" caption="One 
question, a whole investigation: the assistant triages active alarms, then 
draws the response-time and error-rate figures that explain them — the same 
widgets the dashboards use, numbered so the prose can point at them." >}}
+
+## Answers you can see, not a wall of text
+
+The assistant's core habit is *show, don't describe*. It writes a sentence or 
two, then **draws a real figure**, then interprets what that figure actually 
shows — and moves to the next one. Every figure is a genuine render, not a 
screenshot or a made-up number: line charts and single-value cards, top-N 
lists, labeled tables, and record lists, each chosen by the shape of the 
underlying metric expression. A single running **Figure N** counter numbers 
every block it draws, so the narrative  [...]
+
+It doesn't stop at charts. When a question is about how things connect or 
where something ran, the assistant **embeds the real feature views inline, 
read-only** — the same components the dedicated pages use, focused for you:
+
+- **The dependency views** — a focused **one-hop topology** (a service's 
direct upstream callers and downstream dependencies, not the whole-layer map), 
its **cross-layer hierarchy** (the Smartscape fan projecting a service up into 
its mesh mirror and down into its backing infrastructure), the **deployment** 
graph, the **instance map** for a source→destination pair, and the 
**API-dependency** chain — each zoomable and filterable in place.
+- **The signal explorers** — the real **Traces** list with the span 
**waterfall** on a row click (native SkyWalking *and* Zipkin-tracing layers), 
the stored **Logs** view, and, for a browser app, the **Browser errors** stream 
with stack traces.
+
+![Figure 1: Asked how a service connects, the assistant draws its dependency 
graph inline — no link-out, the same component the topology page 
uses.](/screenshots/horizon-1.0/ai-01-topology.webp)
+Figure 1: Asked how a service connects, the assistant draws its dependency 
graph inline — no link-out, the same component the topology page uses.</br>
+
+## Grounded in live data — it doesn't invent metrics
+
+Those figures are trustworthy because the assistant isn't free-associating 
about your system. It answers by combining three sources, and it's the 
interplay between them that turns scattered signals into one coherent picture:
+
+- **Live data** — it reads through the **same OAP query protocol the 
dashboards use**, so it sees exactly what your dashboards see, scoped to your 
permissions and its own time window.
+- **Your layer configuration, used as a skill** — the layer and overview 
templates are the assistant's catalog of what each layer measures: the curated 
metrics and their **MQE** expressions, each metric's entity **scope** (Service 
/ ServiceInstance / Endpoint), and which components a layer carries. It renders 
those expressions **verbatim** rather than inventing them — so a chat figure 
matches the dashboard — and a layer with no trace component simply says so.
+- **SkyWalking's model** — layers, scopes, the metric catalog, topology and 
hierarchy — the connective tissue that lets it tie a metric to the entity it 
belongs to and walk a dependency edge.
+
+There's a nice consequence: because that catalog is *your* configuration, 
edited in the **Layer dashboards** admin, it's a lever you control. Add a 
metric to a layer or enable its traces/logs component and the assistant uses it 
in the next investigation; configuring your layers well is, in effect, how you 
extend what it can do.
+
+![Figure 2: Before drawing anything, the assistant orients with the same 
building blocks the UI uses — list the layers and services, browse the metric 
catalog — so every figure is a real, catalog-backed 
query.](/screenshots/horizon-1.0/ai-02-catalog-grounded.webp)
+Figure 2: Before drawing anything, the assistant orients with the same 
building blocks the UI uses — list the layers and services, browse the metric 
catalog — so every figure is a real, catalog-backed query.</br>
+
+## Guided root-cause, with the discipline to stop
+
+Ask *"what's the root cause?"* and the assistant doesn't wander. It loads a 
matching **investigation playbook** — a master method plus focused variants for 
latency, error-rate / SLA, saturation, a middleware dependency, a Kubernetes 
workload, or a service mesh.
+
+When a service looks unhealthy, the cause may be the service itself or 
something it depends on. So the assistant **follows the dependency graph to 
find where the problem originates** — the root service — instead of stopping at 
the first symptom, separating a service's own fault from one it inherited from 
a dependency it calls. From there it drills into that service's slowest 
**instances and endpoints**, then reaches the **error stack**. When the trail 
leaves the application tier it follo [...]
+
+For a Kubernetes workload it can pull a pod container's **on-demand logs** — 
the error stack — and show the fetched lines inline as a **read-only result**. 
Those logs stream straight from the cluster and are never stored; the block 
isn't a live console, so to see newer lines you ask again, or open the 
dedicated **Pod Logs** tab to keep a tail running. It inherits your `logs:read` 
permission and is gated on OAP, so if on-demand logs are switched off the 
assistant says so instead of failing.
+
+And crucially, it knows when to **stop**. When the available data and tools 
can't localize the cause any further, it gives you a bounded, honest answer — 
the conclusion or best hypothesis *with the evidence behind it*, and a numbered 
list of exactly what it could not determine and why — rather than looping 
forever across random pods and metrics. On Kubernetes it will even hand the 
investigation forward with the precise `kubectl` commands to run and paste back.
+
+![Figure 3: The end of an investigation is a summary, not a dead end — what's 
wrong, which services, the likely pattern, and the concrete next steps to 
confirm it.](/screenshots/horizon-1.0/ai-03-summary.webp)
+Figure 3: The end of an investigation is a summary, not a dead end — what's 
wrong, which services, the likely pattern, and the concrete next steps to 
confirm it.</br>
+
+## Read-only, and one action you approve
+
+All of the assistant's investigation tools are **read-only** — it observes and 
explains, and never changes configuration, rules or dashboards. **Profiling is 
the only action**, and it's gated twice over: when metrics and traces can't 
localize a cause, the assistant *proposes* a profiling task as a **decision 
card** — what it found, why profiling would help, what it expects to reveal — 
and nothing runs until **you approve it** in the popout, and only if you hold 
the `profile:enable` permi [...]
+
+That posture holds all the way down. Reaching the assistant needs the 
`ai:read` permission (granted to the viewer, maintainer, operator and admin 
roles by default) — but that only opens the chat. Every data tool then 
**re-checks its own read verb** before it runs: `metrics:read` for figures, 
`alarms:read` for alarms, `topology:read` for the graphs, `traces:read`, 
`logs:read`, `browser-errors:read`. A tool you lack the verb for is refused and 
shows as a **denied** chip in the transcript,  [...]
+
+<!-- FIGURE TO CAPTURE (see CAPTURE-CHECKLIST.md): the profiling decision card 
— the assistant's proposed cause + rationale + expectation, with the Approve 
control, before anything runs. -->
+
+## Bring your own LLM
+
+Here is the part that decides whether you can actually run this: **you don't 
need a frontier model.** The assistant is **vendor-neutral** — it talks to your 
model through a pluggable transport, so no specific vendor is required. The 
default is any **OpenAI-compatible** endpoint (a hosted model, a self-hosted or 
local model, or an AI gateway); **Amazon Bedrock** is supported too. You set a 
model id, a base URL, and an API key, and that's the integration.
+
+Why can a modest model do this well? Because the observability expertise 
doesn't live in the model — it lives in the **tools, the metric catalog and the 
built-in playbooks**. The model's job is to *orchestrate* those tools and 
*narrate* the results, not to reason about SkyWalking from scratch (temperature 
is fixed at 0 for reliable tool-calling). In practice, a cost-efficient, 
tool-calling-capable model is usually enough — you do not have to pay for, or 
wait on, the largest model on the  [...]
+
+Enabling it is a small config block. In `horizon.yaml`, or entirely via 
`HORIZON_AI_*` environment variables:
+
+```yaml
+ai:
+  enabled: true
+  provider: openai-compatible   # or: bedrock
+  model: "your-model-id"
+  baseUrl: "https://your-endpoint/v1";
+  apiKey: "${HORIZON_AI_API_KEY}"   # secret — env only, redacted from logs
+```
+
+The API key is a secret: set it via environment only, and it is redacted from 
logs and excluded from the audit trail. The floating **AI Assistant** launcher 
shows for every signed-in user, so the feature is discoverable — but until it's 
enabled and pointed at a model, the panel opens **read-only** with a short "ask 
your administrator to set it up" notice instead of a chat box. Both the system 
prompt and the starter example chips ship with sensible defaults and can be 
replaced entirely, a [...]
+
+<!-- FIGURE TO CAPTURE (see CAPTURE-CHECKLIST.md): the enable/config surface — 
the launcher's read-only "ask your administrator" state, or the AI config 
block. -->
+
+## Safe by construction
+
+Because the assistant reads untrusted operational data — service and pod 
names, alarm messages, log lines, trace text — it is **designed to treat 
everything a tool returns as data to be analyzed, never as instructions to 
obey**. A log line that says "ignore previous instructions" is quoted and 
investigated, not acted on. It is instructed to keep to the observability task 
and not to surface its own configuration or another user's data. Combined with 
read-only-by-default, a read-verb re-ch [...]
+
+## Where it lives, and getting started
+
+Open the assistant as a **side drawer** from the launcher, **expand it to a 
full page** at `/ai` when you want more room, or pop it into its own browser 
tab. It keeps its own time window (a clock in the chat header, default the last 
hour), and there's no service picker — just name the service in your question. 
On privacy: your model **credentials live only in the server configuration, 
never in the browser**; the conversation history is kept in your browser's 
**local storage** (capped, sy [...]
+
+The AI Assistant ships with **Horizon UI 1.0**. To try it, enable the `ai:` 
block, point it at a model you already have access to, and ask it the first 
question you'd normally go digging for. Full configuration details are in the 
[AI Assistant 
documentation](/docs/skywalking-horizon-ui/next/operate/ai-assistant/).
+
+If you're new to Horizon, start with the series opener — [Meet Horizon UI · 
1/17](/blog/2026-06-21-skywalking-horizon-ui-introduction/) — and the 
[getting-started 
guide](/blog/2026-06-30-horizon-ui-getting-started-and-migration/). Then come 
back and let the assistant give you the guided tour of your own estate.
diff --git a/content/images/home/horizon-ai-assistant.mp4 
b/content/images/home/horizon-ai-assistant.mp4
new file mode 100644
index 000000000000..d3c3acefba35
Binary files /dev/null and b/content/images/home/horizon-ai-assistant.mp4 differ
diff --git a/content/images/home/horizon-ai-assistant.png 
b/content/images/home/horizon-ai-assistant.png
new file mode 100644
index 000000000000..8b6137eaf063
Binary files /dev/null and b/content/images/home/horizon-ai-assistant.png differ
diff --git a/content/zh/2026-07-06-horizon-ui-ai-assistant/index.md 
b/content/zh/2026-07-06-horizon-ui-ai-assistant/index.md
new file mode 100644
index 000000000000..5b2a50d053de
--- /dev/null
+++ b/content/zh/2026-07-06-horizon-ui-ai-assistant/index.md
@@ -0,0 +1,98 @@
+---
+title: "认识 Horizon UI · AI Assistant:用日常语言查询你的可观测性数据"
+date: 2026-07-06
+draft: true
+author: 吴晟
+description: "Horizon UI 新增的 AI Assistant 可以用和 UI 相同的图表、拓扑和表格回答关于 live system 
的问题;它只读、继承权限,并运行在你自己接入的高性价比模型上。"
+tags:
+  - Release
+  - AI
+  - Cloud Native
+---
+
+*译自英文原文:[Meet Horizon UI · The AI Assistant: Ask Your Observability Data in 
Plain Language](/blog/2026-07-06-horizon-ui-ai-assistant/)。*
+
+[**Meet Horizon UI**](/zh/2026-06-21-skywalking-horizon-ui-introduction/) 
系列已经以 17/17 收官:它完整讲过 SkyWalking 新控制台的每个界面,从映射系统全貌的侧边栏、adaptive 
dashboards、topology 和 3D map,到 trace 和 log 
explorers、profiling、alarms、operations surface、access control,以及 config-driven 
customization。这篇是新的章节,随 **Horizon UI 1.0** 一起到来:内置的 **AI Assistant** 
让你可以像聊天一样查询自己的可观测性数据,而不是一路点进去查。
+
+它不是简单地给 dashboard 加一个聊天入口。你可以问它:*"what's unhealthy in the system right 
now?"*、*"investigate the response time for a service"*。它会通过和 dashboards 相同的 
query path,从你的 OAP backend 读取 **live data**,然后流式返回一段有顺序的分析叙事,并使用 Horizon 
里到处都在用的**同一套 charts、topology 和 tables**。它是**只读**的,**继承你的权限**,并且默认关闭,直到 operator 
启用它并配置好模型。
+
+{{< video src="/screenshots/horizon-1.0/ai-00-investigation.mp4" 
poster="/screenshots/horizon-1.0/ai-00-investigation-poster.webp" 
caption="一个问题,一次完整调查:assistant 先 triage active alarms,再绘制解释它们的 response-time 和 
error-rate 图;这些图来自 dashboards 使用的同一套 widgets,并带有编号,方便正文引用。" >}}
+
+## 能看见的答案,而不是一堵文字墙
+
+Assistant 的核心习惯是 *show, don't 
describe*。它先写一两句话,然后**画出真实图形**,解释图里实际出现了什么,再进入下一步。每个 figure 都是真实 
render,不是截图,也不是编出来的数字:line charts、single-value cards、top-N lists、带 label 的 
tables 和 record lists,都会根据底层 metric expression 的形状来选择。它画出的每个 block 都会使用一个连续递增的 
**Figure N** 计数,所以叙事可以指向自己真实渲染出的图,比如 “the response-time chart above shows the 
spike”,而不是泛泛而谈。
+
+它也不止画 charts。只要问题涉及对象之间如何连接,或者某个东西运行在哪里,assistant 就会把**真实 feature view 
以内联、只读方式嵌进对话里**。这些都是 dedicated pages 使用的同一套 components,只是帮你聚焦到当前问题:
+
+- **Dependency views**:focused **one-hop topology**(某个 service 的直接 upstream 
callers 和 downstream dependencies,而不是整张 layer map)、它的 **cross-layer 
hierarchy**(Smartscape fan,把 service 向上映射到 mesh mirror,向下映射到 backing 
infrastructure)、**deployment** graph、source→destination pair 的 **instance 
map**,以及 **API-dependency** chain;这些视图都可以在对话里 zoom 和 filter。
+- **Signal explorers**:真实的 **Traces** list,并且点击行后显示 span **waterfall**(native 
SkyWalking 和 Zipkin tracing layers 都支持);stored **Logs** view;以及 browser app 的 
**Browser errors** stream 和 stack traces。
+
+![图 1:当问题是服务如何连接时,assistant 会直接在对话里画出 dependency graph;无需跳转,使用的也是 topology 
页面同一套 component。](/screenshots/horizon-1.0/ai-01-topology.webp)
+图 1:当问题是服务如何连接时,assistant 会直接在对话里画出 dependency graph;无需跳转,使用的也是 topology 页面同一套 
component。</br>
+
+## 基于 live data,不会编造 metrics
+
+这些 figures 可信,是因为 assistant 不是在自由联想你的系统。它把三类来源组合起来回答问题,而正是它们之间的配合,把分散的 signals 
变成一张连贯的图:
+
+- **Live data**:它通过 dashboards 使用的**同一个 OAP query protocol** 读取数据,所以看到的就是 
dashboards 看到的内容,并且被限制在你的权限和它自己的 time window 内。
+- **你的 layer 配置,被当作 skill 使用**:layer 和 overview templates 是 assistant 认识每个 
layer 的目录:有哪些 curated metrics 和它们的 **MQE** expressions,每个 metric 属于哪个 entity 
**scope**(Service / ServiceInstance / Endpoint),以及这个 layer 带有哪些 
components。它会**原样渲染**这些 expressions,而不是临时发明 metric 名;因此 chat 里的 figure 会和 
dashboard 对齐。如果某个 layer 没有 trace component,它也会直接说明。
+- **SkyWalking 的模型**:layers、scopes、metric catalog、topology 和 hierarchy。这些是 
connective tissue,让它能把 metric 绑定到对应 entity,并沿 dependency edge 继续分析。
+
+这带来一个很好的结果:catalog 来自*你的*配置,也就是你在 **Layer dashboards** admin 
里编辑的内容,所以它也是你可以控制的扩展点。给 layer 加一个 metric,或者启用 traces/logs component,assistant 
下一次 investigation 就会使用它;把 layer 配好,本质上就是在扩展 assistant 能做什么。
+
+![图 2:在画任何东西之前,assistant 会先用和 UI 相同的 building blocks 建立方向感:列出 layers 和 
services,浏览 metric catalog;因此每个 figure 都是 catalog-backed 
query。](/screenshots/horizon-1.0/ai-02-catalog-grounded.webp)
+图 2:在画任何东西之前,assistant 会先用和 UI 相同的 building blocks 建立方向感:列出 layers 和 
services,浏览 metric catalog;因此每个 figure 都是 catalog-backed query。</br>
+
+## 有引导的 root-cause,也知道何时停止
+
+你问 *"what's the root cause?"*,assistant 不会漫游。它会加载匹配的 **investigation 
playbook**:一个 master method,再加上 latency、error-rate / SLA、saturation、middleware 
dependency、Kubernetes workload 或 service mesh 的 focused variants。
+
+当一个 service 看起来不健康时,原因可能在它自己,也可能在它依赖的东西上。所以 assistant 会**沿 dependency graph 
找到问题从哪里开始**,也就是 root service,而不是停在第一个 symptom 上;它会区分 service 自身故障和它从被调用 
dependency 继承来的故障。找到那里后,它继续钻到这个 service 最慢的 **instances 和 endpoints**,再触达 
**error stack**。当线索离开 application tier,它会沿 cross-layer hierarchy **向下进入 backing 
infrastructure**。database、cache 或 queue 是 topology leaf,没有更下游的服务,所以 
investigation 会在那里触底,然后转向它的 logs、Kubernetes hierarchy 和 network edge,因为 memory 
/ disk / connection pressure 这类原因往往就在这些地方。
+
+对 Kubernetes workload,它可以拉取 pod container 的 **on-demand logs**,也就是 error 
stack,并把获取到的日志行作为**只读结果**内联展示。这些日志直接从 cluster stream 过来,不会被存储;这个 block 不是 live 
console,所以如果要看更新的行,可以再问一次,或者打开专门的 **Pod Logs** tab 保持 tail。它继承你的 `logs:read` 
权限,并受 OAP 能力控制;如果 on-demand logs 关闭了,assistant 会直接说明,而不是静默失败。
+
+更关键的是,它知道什么时候该**停止**。当现有数据和工具无法进一步定位原因时,它会给出有边界、诚实的答案:结论或最佳假设、背后的证据,以及一个编号列表,逐条说明它无法确定什么、为什么无法确定,而不是在随机
 pods 和 metrics 之间无限循环。对于 Kubernetes,它甚至会把调查交接下去,给出精确的 `kubectl` 命令,让你执行后把结果贴回来。
+
+![图 3:一次 investigation 的结尾是一份 summary,而不是死胡同:哪里出了问题、影响哪些 
services、可能是什么模式,以及接下来如何确认。](/screenshots/horizon-1.0/ai-03-summary.webp)
+图 3:一次 investigation 的结尾是一份 summary,而不是死胡同:哪里出了问题、影响哪些 
services、可能是什么模式,以及接下来如何确认。</br>
+
+## 只读,以及一个需要你批准的动作
+
+Assistant 的所有 investigation tools 都是**只读**的:它只观察和解释,不会修改 configuration、rules 或 
dashboards。**Profiling 是唯一的 action**,并且有两层 gate:当 metrics 和 traces 
无法定位原因时,assistant 会把 profiling task 作为 **decision card** *提议*出来,里面写清楚它发现了什么、为什么 
profiling 有帮助、它预期看到什么。只有你在 popout 里**批准**,并且你持有 `profile:enable` 
权限时,任务才会运行。Profile 收集完成后,你可以在后续 turn 里让它分析结果;它不会自己触发任何动作。
+
+这个姿态贯穿到底。进入 assistant 需要 `ai:read` 权限(内置 viewer、maintainer、operator 和 admin 
roles 默认都有),但这只代表能打开 chat。每个 data tool 执行前都会**重新检查自己的 read verb**:figures 需要 
`metrics:read`,alarms 需要 `alarms:read`,graphs 需要 `topology:read`,此外还有 
`traces:read`、`logs:read`、`browser-errors:read`。如果你没有某个 verb,对应 tool 会被拒绝,并在 
transcript 里显示为 **denied** chip,所以 assistant 不能看到超过你权限范围的数据。
+
+<!-- FIGURE TO CAPTURE (see CAPTURE-CHECKLIST.md): the profiling decision card 
— the assistant's proposed cause + rationale + expectation, with the Approve 
control, before anything runs. -->
+
+## Bring your own LLM
+
+这里决定了你能不能真的跑起来:**不需要 frontier model**。Assistant 是 **vendor-neutral** 的,通过 
pluggable transport 访问你的模型,不绑定特定 vendor。默认支持任何 **OpenAI-compatible** 
endpoint(hosted model、自托管或本地模型、AI gateway 都可以);也支持 **Amazon Bedrock**。你只需要设置 
model id、base URL 和 API key,集成就完成了。
+
+为什么中等规模的模型也能做好这件事?因为 observability expertise 不在模型里,而在 **tools、metric catalog 
和内置 playbooks** 里。模型的工作是*编排*这些 tools,并*叙述*结果,而不是从零开始理解 SkyWalking(temperature 
固定为 0,以获得稳定的 tool-calling)。实际使用中,一个高性价比、具备 tool-calling 能力的模型通常就足够;你不需要为了得到可靠 
investigation 而付费使用、或者等待市场上最大的模型。
+
+启用它只需要一小段 config。可以写在 `horizon.yaml`,也可以完全通过 `HORIZON_AI_*` 环境变量配置:
+
+```yaml
+ai:
+  enabled: true
+  provider: openai-compatible   # or: bedrock
+  model: "your-model-id"
+  baseUrl: "https://your-endpoint/v1";
+  apiKey: "${HORIZON_AI_API_KEY}"   # secret — env only, redacted from logs
+```
+
+API key 是 secret:只通过环境变量设置,会从 logs 中 redact,并排除在 audit trail 之外。浮动的 **AI 
Assistant** launcher 会对每个已登录用户显示,让功能可发现;但在它被启用并指向模型之前,panel 
会以**只读**方式打开,显示一个简短的 “ask your administrator to set it up” 提示,而不是 chat 
box。System prompt 和 starter example chips 都带有合理默认值,也可以被完整替换;starter 还可以嵌入 
`<service>` 或 `<layer>` placeholder,打开一个 free-text fill-in。你输入近似名称,模型会在 query 
time 把它解析为真实 entity。
+
+<!-- FIGURE TO CAPTURE (see CAPTURE-CHECKLIST.md): the enable/config surface — 
the launcher's read-only "ask your administrator" state, or the AI config 
block. -->
+
+## Safe by construction
+
+因为 assistant 会读取不可信的 operational data,比如 service 和 pod names、alarm 
messages、log lines、trace text,所以它被设计为**把 tool 
返回的一切都当作待分析的数据,而不是要服从的指令**。一行日志如果写着 "ignore previous 
instructions",它会被引用和调查,而不是被执行。Assistant 被要求留在 observability task 
内,不展示自己的配置,也不展示其他用户的数据。结合 read-only-by-default、每个 tool 的 read-verb re-check,以及 
logs 和 audit trail 中的 secret redaction,这个 assistant 的设计目标就是可以安全地接到真实生产 backend 
上。
+
+## 它在哪里,以及如何开始
+
+你可以从 launcher 把 assistant 打开为 **side drawer**;需要更多空间时,把它**展开成 `/ai` full 
page**;也可以 pop out 到单独 browser tab。它有自己的 time window(chat header 里有 
clock,默认过去一小时),没有 service picker:直接在问题里写 service 名即可。隐私方面:你的模型**凭证只存在 server 
configuration 里,不会进入 browser**;conversation history 保存在 browser 的 **local 
storage** 中(有上限,跨 tab 同步),你可以从 `/ai` 的 History sidebar 删除任意 conversation。
+
+AI Assistant 随 **Horizon UI 1.0** 发布。要试用它,启用 `ai:` 
block,指向一个你已有访问权限的模型,然后问出第一个你原本会手动排查的问题。完整配置说明请看 [AI Assistant 
documentation](/docs/skywalking-horizon-ui/next/operate/ai-assistant/)。
+
+如果你刚开始了解 Horizon,可以先读系列开篇 [Meet Horizon UI · 
1/17](/zh/2026-06-21-skywalking-horizon-ui-introduction/) 和 [getting-started 
guide](/zh/2026-06-30-horizon-ui-getting-started-and-migration/)。然后回来,让 
assistant 带你走一遍你自己的系统。
diff --git a/layouts/shortcodes/video.html b/layouts/shortcodes/video.html
new file mode 100644
index 000000000000..2303c4cc8c14
--- /dev/null
+++ b/layouts/shortcodes/video.html
@@ -0,0 +1,16 @@
+{{- /* Inline, self-hosted video for posts. Usage:
+       {{< video src="/screenshots/horizon-1.0/x.mp4" 
poster="/screenshots/horizon-1.0/x.webp" caption="..." >}}
+       Click-to-play (preload=none): the poster loads with the page, the video 
only on play. */ -}}
+{{- $src := .Get "src" -}}
+{{- $poster := .Get "poster" -}}
+{{- $caption := .Get "caption" -}}
+<figure class="post-video" style="margin:1.6rem 0;">
+  <video controls muted loop playsinline preload="none"{{ with $poster }} 
poster="{{ . }}"{{ end }}
+         
style="width:100%;height:auto;display:block;border-radius:10px;border:1px solid 
#e6e9ee;background:#0f131a;">
+    <source src="{{ $src }}" type="video/mp4">
+    Your browser does not support embedded video. <a href="{{ $src 
}}">Download the clip</a>.
+  </video>
+  {{- with $caption }}
+  <figcaption 
style="font-size:14px;color:#6b7280;line-height:1.5;margin-top:8px;">{{ . | 
markdownify }}</figcaption>
+  {{- end }}
+</figure>
diff --git a/static/screenshots/horizon-1.0/CAPTURE-CHECKLIST.md 
b/static/screenshots/horizon-1.0/CAPTURE-CHECKLIST.md
new file mode 100644
index 000000000000..15728c0f820a
--- /dev/null
+++ b/static/screenshots/horizon-1.0/CAPTURE-CHECKLIST.md
@@ -0,0 +1,41 @@
+# Horizon UI 1.0 — AI Assistant post — screenshot capture checklist
+
+Assets for `content/blog/2026-07-06-horizon-ui-ai-assistant/index.md`, 
referenced as
+`/screenshots/horizon-1.0/<file>`. Capture against a **populated demo OAP with 
the AI
+Assistant enabled** and a model configured. Dark theme, ~1440px-wide viewport, 
to match
+the 0.7.0 series.
+
+## Already in place (extracted from the screen recording)
+
+- [x] `ai-00-investigation.mp4` + `ai-00-investigation-poster.webp` — the lead 
video (a 3x
+      capture: "what's unhealthy?" → alarms → response-time / error-rate 
figures).
+- [x] `ai-01-topology.webp` — the assistant drawing a service-dependency graph 
inline.
+- [x] `ai-02-catalog-grounded.webp` — the assistant orienting with list_layers 
/ list_services /
+      catalog tool calls before rendering a figure.
+- [x] `ai-03-summary.webp` — a bounded, honest "Summary of what's unhealthy" 
conclusion.
+
+## Still to capture (the post has `<!-- FIGURE TO CAPTURE -->` markers at 
these spots)
+
+- [ ] `ai-04-profiling-card.webp` — **the profiling decision card.**
+  - **Reach:** run an investigation where metrics/traces can't localize the 
cause so the
+    assistant calls `propose_profiling`; capture the decision card showing its 
proposed
+    cause, the rationale ("why profiling"), what it expects to reveal, and the 
**Approve**
+    control — *before* anything runs.
+  - **Section:** "It proposes; you approve."
+
+- [ ] `ai-05-enable.webp` — **the enable/config surface.**
+  - **Reach:** the launcher's **read-only "ask your administrator to set it 
up" state** (what a
+    user sees before the feature is enabled/configured), or the `ai:` config 
block itself.
+  - **Section:** "Bring your own LLM." (Note: there is **no** "bring your own 
key" playground —
+    credentials are server-side central config only.)
+
+## Optional / nice-to-have
+
+- [ ] A shot of the **starter chips** with the `<service>` fill-in open (type 
a partial name /
+      description → resolved to a real service). Would slot into "Where it 
lives".
+- [ ] The **drawer vs. full-page (`/ai`)** framing, if a side-by-side helps.
+- [ ] The assistant reading **live Kubernetes pod logs** (the on-demand tail 
pane), for the
+      root-cause section.
+
+> Filenames are the contract — save the captures under these exact names and 
the post picks
+> them up. Convert PNG captures to webp with `cwebp -q 84 in.png -o out.webp`.
diff --git a/static/screenshots/horizon-1.0/ai-00-investigation-poster.webp 
b/static/screenshots/horizon-1.0/ai-00-investigation-poster.webp
new file mode 100644
index 000000000000..82f90a86a79c
Binary files /dev/null and 
b/static/screenshots/horizon-1.0/ai-00-investigation-poster.webp differ
diff --git a/static/screenshots/horizon-1.0/ai-00-investigation.mp4 
b/static/screenshots/horizon-1.0/ai-00-investigation.mp4
new file mode 100644
index 000000000000..d3c3acefba35
Binary files /dev/null and 
b/static/screenshots/horizon-1.0/ai-00-investigation.mp4 differ
diff --git a/static/screenshots/horizon-1.0/ai-01-topology.webp 
b/static/screenshots/horizon-1.0/ai-01-topology.webp
new file mode 100644
index 000000000000..992f1f0eacb6
Binary files /dev/null and b/static/screenshots/horizon-1.0/ai-01-topology.webp 
differ
diff --git a/static/screenshots/horizon-1.0/ai-02-catalog-grounded.webp 
b/static/screenshots/horizon-1.0/ai-02-catalog-grounded.webp
new file mode 100644
index 000000000000..1a2ea27df32a
Binary files /dev/null and 
b/static/screenshots/horizon-1.0/ai-02-catalog-grounded.webp differ
diff --git a/static/screenshots/horizon-1.0/ai-03-summary.webp 
b/static/screenshots/horizon-1.0/ai-03-summary.webp
new file mode 100644
index 000000000000..4d9fe2cf9bfe
Binary files /dev/null and b/static/screenshots/horizon-1.0/ai-03-summary.webp 
differ


Reply via email to