From 31c7f1c4c15916d24cad1e278b3f4c90e6bcaadc Mon Sep 17 00:00:00 2001 From: Sebastian Maniak Date: Mon, 9 Mar 2026 15:55:45 -0400 Subject: [PATCH 01/27] docs: add comprehensive concept, CRD reference, and enterprise documentation Add 17 new MDX pages covering: - Core Concepts: tools ecosystem, human-in-the-loop, agent memory, prompt templates, multi-runtime (Go/Python ADK), git-based skills, context management - Resources: full Agent CRD reference (Agent, ModelConfig, RemoteMCPServer, MCPServer, ModelProviderConfig) - Solo Enterprise: overview, installation, security & access control, multicluster federation, observability (OTel/ClickHouse), enterprise UI, BYO agent frameworks (ADK/CrewAI/LangGraph), model providers, tools & MCP Update navigation.json with entries for all new pages. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Art Berger --- .../kagent/concepts/agent-memory/page.mdx | 104 +++++++++ .../concepts/context-management/page.mdx | 57 +++++ .../kagent/concepts/git-based-skills/page.mdx | 137 ++++++++++++ .../concepts/human-in-the-loop/page.mdx | 130 +++++++++++ .../kagent/concepts/multi-runtime/page.mdx | 104 +++++++++ .../kagent/concepts/prompt-templates/page.mdx | 102 +++++++++ .../kagent/concepts/tools-ecosystem/page.mdx | 204 ++++++++++++++++++ .../enterprise/agent-frameworks/page.mdx | 92 ++++++++ .../kagent/enterprise/enterprise-ui/page.mdx | 100 +++++++++ .../kagent/enterprise/installation/page.mdx | 113 ++++++++++ .../enterprise/model-providers/page.mdx | 68 ++++++ .../kagent/enterprise/multicluster/page.mdx | 91 ++++++++ .../kagent/enterprise/observability/page.mdx | 131 +++++++++++ src/app/docs/kagent/enterprise/page.mdx | 58 +++++ .../docs/kagent/enterprise/security/page.mdx | 93 ++++++++ .../enterprise/tools-mcp-servers/page.mdx | 82 +++++++ .../resources/agent-crd-reference/page.mdx | 194 +++++++++++++++++ src/config/navigation.json | 87 ++++++++ 18 files changed, 1947 insertions(+) create mode 100644 src/app/docs/kagent/concepts/agent-memory/page.mdx create mode 100644 src/app/docs/kagent/concepts/context-management/page.mdx create mode 100644 src/app/docs/kagent/concepts/git-based-skills/page.mdx create mode 100644 src/app/docs/kagent/concepts/human-in-the-loop/page.mdx create mode 100644 src/app/docs/kagent/concepts/multi-runtime/page.mdx create mode 100644 src/app/docs/kagent/concepts/prompt-templates/page.mdx create mode 100644 src/app/docs/kagent/concepts/tools-ecosystem/page.mdx create mode 100644 src/app/docs/kagent/enterprise/agent-frameworks/page.mdx create mode 100644 src/app/docs/kagent/enterprise/enterprise-ui/page.mdx create mode 100644 src/app/docs/kagent/enterprise/installation/page.mdx create mode 100644 src/app/docs/kagent/enterprise/model-providers/page.mdx create mode 100644 src/app/docs/kagent/enterprise/multicluster/page.mdx create mode 100644 src/app/docs/kagent/enterprise/observability/page.mdx create mode 100644 src/app/docs/kagent/enterprise/page.mdx create mode 100644 src/app/docs/kagent/enterprise/security/page.mdx create mode 100644 src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx create mode 100644 src/app/docs/kagent/resources/agent-crd-reference/page.mdx diff --git a/src/app/docs/kagent/concepts/agent-memory/page.mdx b/src/app/docs/kagent/concepts/agent-memory/page.mdx new file mode 100644 index 0000000..bd4f059 --- /dev/null +++ b/src/app/docs/kagent/concepts/agent-memory/page.mdx @@ -0,0 +1,104 @@ +--- +title: "Agent Memory" +pageOrder: 5 +description: "Enable vector-backed long-term memory for agents to learn from past interactions." +--- + +export const metadata = { + title: "Agent Memory", + description: "Enable vector-backed long-term memory for agents to learn from past interactions.", + author: "kagent.dev" +}; + +# Agent Memory + +kagent provides long-term memory for agents using vector similarity search. Agents can automatically save and retrieve relevant context across conversations. + +## Overview + +Memory in kagent is: +- **Vector-backed** — Uses embedding models to encode memories as 768-dimensional vectors +- **Searchable** — Retrieves relevant memories via cosine similarity +- **Automatic** — Extracts and saves memories periodically without explicit user action +- **Time-bounded** — Memories expire after a configurable TTL (default 15 days) + +## Supported Storage Backends + +| Backend | Description | +|---------|-------------| +| **pgvector** (PostgreSQL) | Full-featured vector search using the pgvector extension | +| **Turso/libSQL** (SQLite) | Lightweight alternative using SQLite-compatible storage | + +## Configuration + +### Enable Memory on an Agent + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: memory-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You are a helpful assistant with long-term memory." + memory: + enabled: true + embeddingProvider: + type: OpenAI + model: text-embedding-3-small +``` + +### Memory with Separate Embedding Provider + +```yaml +memory: + enabled: true + embeddingProvider: + type: OpenAI + model: text-embedding-3-small + secretRef: + name: openai-embedding-key +``` + +## How Memory Works + +### Automatic Save Cycle + +1. The agent processes user messages normally +2. Every 5th user message, the agent automatically extracts key information +3. Extracted memories are summarized and encoded as embedding vectors +4. Vectors are stored in the database with metadata and timestamps + +### Memory Retrieval (Prefetch) + +Before generating a response, the agent: +1. Encodes the current user message as an embedding vector +2. Searches stored memories by cosine similarity +3. Injects the most relevant memories into the agent's context + +### Memory Tools + +When memory is enabled, three tools are injected into the agent: + +| Tool | Description | +|------|-------------| +| `save_memory` | Explicitly save a piece of information | +| `load_memory` | Search for relevant memories by query | +| `prefetch_memory` | Automatically run before response generation | + +## Memory Management via API + +``` +GET /api/memories/{agentId} # List memories +DELETE /api/memories/{agentId} # Clear all memories +DELETE /api/memories/{agentId}/{id} # Delete specific memory +``` + +## Technical Details + +- Embedding vectors are normalized to 768 dimensions +- Background TTL pruning runs periodically (default retention: 15 days) +- Memory is per-agent — each agent has its own isolated memory store +- Memories include timestamps and source session references diff --git a/src/app/docs/kagent/concepts/context-management/page.mdx b/src/app/docs/kagent/concepts/context-management/page.mdx new file mode 100644 index 0000000..c58ddb6 --- /dev/null +++ b/src/app/docs/kagent/concepts/context-management/page.mdx @@ -0,0 +1,57 @@ +--- +title: "Context Management" +pageOrder: 9 +description: "Automatically summarize older messages to stay within LLM context windows during long conversations." +--- + +export const metadata = { + title: "Context Management", + description: "Automatically summarize older messages to stay within LLM context windows during long conversations.", + author: "kagent.dev" +}; + +# Context Management + +Long conversations can exceed LLM context windows. kagent provides **event compaction** to automatically summarize older messages, preserving key information while reducing token count. + +## Configuration + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: long-conversation-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You are a helpful agent for extended sessions." + context: + eventsCompaction: + enabled: true +``` + +## How It Works + +1. As the conversation progresses, events accumulate in the session history +2. When the history approaches the model's context limit, compaction triggers +3. Older events are summarized while preserving: + - Key decisions and outcomes + - Important tool results + - Critical context from earlier in the conversation +4. The agent continues with the compacted history seamlessly + +## When to Use + +Enable event compaction when: +- Agents handle long-running conversations (debugging sessions, investigations) +- Agents call many tools that generate large outputs +- You want to support extended interactions without hitting context limits + +You may not need it for: +- Short, single-turn interactions +- Agents with small tool sets that generate compact outputs + +## Context Caching Note + +Prompt caching (a separate optimization that caches the prompt prefix for faster responses) is **not** configured at the agent level. Most LLM providers enable prompt caching by default. diff --git a/src/app/docs/kagent/concepts/git-based-skills/page.mdx b/src/app/docs/kagent/concepts/git-based-skills/page.mdx new file mode 100644 index 0000000..4e04a64 --- /dev/null +++ b/src/app/docs/kagent/concepts/git-based-skills/page.mdx @@ -0,0 +1,137 @@ +--- +title: "Git-Based Skills" +pageOrder: 8 +description: "Load markdown knowledge documents from Git repositories to guide agent behavior." +--- + +export const metadata = { + title: "Git-Based Skills", + description: "Load markdown knowledge documents from Git repositories to guide agent behavior.", + author: "kagent.dev" +}; + +# Git-Based Skills + +Skills are markdown-based knowledge documents that agents load at startup. They provide domain-specific instructions, best practices, and procedures that guide agent behavior. + +kagent supports two sources for skills: +- **OCI images** — Container images containing skill files (original approach) +- **Git repositories** — Clone skills directly from Git repos + +## Skill File Format + +Each skill is a directory containing a `SKILL.md` file with YAML frontmatter: + +```markdown +--- +name: kubernetes-troubleshooting +description: Guide for diagnosing and fixing common Kubernetes issues +--- + +# Kubernetes Troubleshooting + +## Pod Crash Loops + +When a pod is in CrashLoopBackOff: + +1. Check logs: `kubectl logs --previous` +2. Check events: `kubectl describe pod ` +3. Verify resource limits... +``` + +## Git Repository Configuration + +### Basic Example + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: my-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You are a helpful agent." + skills: + gitRefs: + - url: https://github.com/myorg/agent-skills.git + ref: main +``` + +### With Subdirectory + +```yaml +skills: + gitRefs: + - url: https://github.com/myorg/monorepo.git + ref: main + path: skills/kubernetes +``` + +### Multiple Sources + +Combine Git and OCI skills: + +```yaml +skills: + refs: + - image: ghcr.io/myorg/k8s-skills:latest + gitRefs: + - url: https://github.com/myorg/skills-repo.git + ref: main + - url: https://github.com/myorg/another-repo.git + ref: develop + path: agent-skills +``` + +## Authentication + +### HTTPS Token Auth + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: git-credentials +type: Opaque +stringData: + token: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +``` + +```yaml +skills: + gitAuthSecretRef: + name: git-credentials + gitRefs: + - url: https://github.com/myorg/private-skills.git + ref: main +``` + +### SSH Key Auth + +```yaml +skills: + gitAuthSecretRef: + name: git-ssh-key + gitRefs: + - url: git@github.com:myorg/private-skills.git + ref: main +``` + +> A single `gitAuthSecretRef` applies to all Git repositories in the agent. All repos must use the same authentication method. + +## How It Works + +Under the hood, kagent uses a lightweight init container (~30MB) containing Git and krane tools: + +1. Before the agent pod starts, the `skills-init` container runs +2. It clones each Git repository to the skills volume +3. It also pulls any OCI skill images +4. The agent runtime discovers skills from the mounted volume at startup + +## Skill Discovery at Runtime + +Once loaded, skills are available through the built-in `SkillsTool`: +- **List skills:** The agent calls the tool with no arguments to see available skills +- **Load skill:** The agent calls the tool with a skill name to get the full content diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx new file mode 100644 index 0000000..6d14344 --- /dev/null +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -0,0 +1,130 @@ +--- +title: "Human-in-the-Loop" +pageOrder: 4 +description: "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions." +--- + +export const metadata = { + title: "Human-in-the-Loop", + description: "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions.", + author: "kagent.dev" +}; + +# Human-in-the-Loop (HITL) + +kagent implements Human-in-the-Loop functionality through two mechanisms: + +1. **Tool Approval** — Require user confirmation before executing sensitive tools +2. **Ask User** — Allow agents to interactively ask users questions during execution + +Both features pause agent execution and wait for user input before continuing. + +## Tool Approval + +### Overview + +Tool approval lets you mark specific tools as requiring user confirmation before execution. When an agent attempts to call an approval-required tool, execution pauses and the UI presents Approve/Reject buttons. + +This is useful for destructive or sensitive operations like: +- Deleting Kubernetes resources +- Writing files +- Executing shell commands +- Modifying infrastructure + +### Configuration + +Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`: + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: k8s-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You are a Kubernetes management agent." + tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + kind: RemoteMCPServer + toolNames: + - read_file + - write_file + - delete_file + requireApproval: + - delete_file + - write_file +``` + +In this example, `read_file` executes immediately, but `write_file` and `delete_file` will pause for user approval. + +### How It Works + +**Interrupt Phase:** +1. The agent calls a tool marked for approval +2. The ADK generates an `adk_request_confirmation` event +3. The UI receives the event and displays approval controls + +**Decision Phase:** +4. The user clicks **Approve** or **Reject** in the UI +5. Optionally, the user provides a rejection reason + +**Resume Phase:** +6. **Approved** tools execute normally and return results +7. **Rejected** tools return a rejection message — the LLM sees this and responds accordingly + +### Parallel Tool Approval + +When an agent generates multiple tool calls simultaneously, all pending approvals are presented together. Users can approve/reject individually or in batch. + +### Rejection Reasons + +When rejecting a tool call, users can provide a free-text explanation. This reason is passed back to the LLM as context, helping it understand why the tool was blocked and adjust its approach. + +--- + +## Ask User Tool + +The `ask_user` tool is a built-in tool automatically added to every agent. It allows agents to pose questions to users with optional predefined choices during execution. + +Use cases: +- Clarifying ambiguous user requests +- Offering choices between implementation approaches +- Collecting configuration preferences +- Getting confirmation on proposed plans + +### Question Types + +| Type | Configuration | UI Rendering | +|------|--------------|--------------| +| Single-select | `choices: [...]`, `multiple: false` | Choice chips (select one) | +| Multi-select | `choices: [...]`, `multiple: true` | Choice chips (select many) | +| Free-text | `choices: []` | Text input field | + +### No Configuration Required + +The `ask_user` tool is added unconditionally to every agent as a built-in tool. You don't need to add it to your Agent spec — it's always available. + +## Architecture Summary + +``` +User --> UI --> A2A Message --> Executor --> ADK --> Tool + | + request_confirmation() + | + <-- input_required --> + | +User <-- UI <-- A2A Event <-- Executor <---- ADK <----+ + | + v (Approve/Reject/Answer) + | +User --> UI --> A2A Message --> Executor --> ADK --> Tool (resumes) +``` + +Key design principles: +- **Deterministic replay** — Approved calls re-invoke via ADK preprocessor without additional LLM calls +- **Minimal custom logic** — The executor only handles the resume path +- **Unified mechanism** — Both tool approval and ask_user share the same `request_confirmation` infrastructure diff --git a/src/app/docs/kagent/concepts/multi-runtime/page.mdx b/src/app/docs/kagent/concepts/multi-runtime/page.mdx new file mode 100644 index 0000000..0fe4481 --- /dev/null +++ b/src/app/docs/kagent/concepts/multi-runtime/page.mdx @@ -0,0 +1,104 @@ +--- +title: "Multi-Runtime Support" +pageOrder: 7 +description: "Choose between Go and Python ADK runtimes for your agents." +--- + +export const metadata = { + title: "Multi-Runtime Support", + description: "Choose between Go and Python ADK runtimes for your agents.", + author: "kagent.dev" +}; + +# Multi-Runtime Support (Go / Python ADK) + +kagent supports two Agent Development Kit (ADK) runtimes for declarative agents. + +## Overview + +| Feature | Python ADK | Go ADK | +|---------|-----------|--------| +| Startup time | ~15 seconds | ~2 seconds | +| Ecosystem | Google ADK, LangGraph, CrewAI integrations | Native Go implementation | +| Resource usage | Higher (Python runtime) | Lower (compiled binary) | +| Default | Yes | No | +| Memory support | Yes | Yes | +| MCP support | Yes | Yes | +| HITL support | Yes | Yes | + +## Configuration + +### Python Runtime (Default) + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: python-agent +spec: + type: Declarative + declarative: + runtime: python + modelConfig: default-model-config + systemMessage: "You are a helpful agent." +``` + +### Go Runtime + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: go-agent +spec: + type: Declarative + declarative: + runtime: go + modelConfig: default-model-config + systemMessage: "You are a fast-starting agent." +``` + +## When to Use Which + +**Choose Go when:** +- Fast startup matters (autoscaling, cold starts) +- Lower resource consumption is important +- You don't need Python-specific framework integrations + +**Choose Python when:** +- You need Google ADK-native features +- You want to use CrewAI, LangGraph, or OpenAI framework integrations +- You need Python-based custom tools or skills + +## Go ADK Built-in Tools + +| Tool | Description | +|------|-------------| +| `SkillsTool` | Discover and load skills from the skills directory | +| `BashTool` | Execute shell commands with timeout handling | +| `ReadFile` | Read file contents with line numbers and pagination | +| `WriteFile` | Write content to files (creates directories as needed) | +| `EditFile` | String replacement with ambiguity detection | + +## BYO (Bring Your Own) Agents + +For maximum flexibility, bring your own agent container: + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: custom-agent +spec: + type: BYO + byo: + image: myregistry/my-custom-agent:v1.0 + deployment: + replicas: 1 + resources: + requests: + memory: "512Mi" + cpu: "500m" +``` + +BYO agents must implement the A2A protocol endpoint for communication with the kagent platform. diff --git a/src/app/docs/kagent/concepts/prompt-templates/page.mdx b/src/app/docs/kagent/concepts/prompt-templates/page.mdx new file mode 100644 index 0000000..af3a5ab --- /dev/null +++ b/src/app/docs/kagent/concepts/prompt-templates/page.mdx @@ -0,0 +1,102 @@ +--- +title: "Prompt Templates" +pageOrder: 6 +description: "Use Go template syntax to compose reusable prompt fragments from ConfigMaps." +--- + +export const metadata = { + title: "Prompt Templates", + description: "Use Go template syntax to compose reusable prompt fragments from ConfigMaps.", + author: "kagent.dev" +}; + +# Prompt Templates + +kagent supports Go `text/template` syntax in Agent system messages, enabling composition from reusable fragments stored in ConfigMaps. + +## Overview + +Instead of duplicating safety guidelines and tool usage instructions in every agent, you can: +1. Store common prompt fragments in ConfigMaps +2. Reference them using `{{include "source/key"}}` syntax +3. Use agent context variables for dynamic interpolation + +Template resolution happens during controller reconciliation — the final system message is fully expanded before reaching the agent runtime. + +## Built-in Prompt Templates + +kagent ships a `kagent-builtin-prompts` ConfigMap with five reusable templates: + +| Template Key | Description | +|-------------|-------------| +| `skills-usage` | Instructions for discovering and using skills | +| `tool-usage-best-practices` | Best practices for tool invocation | +| `safety-guardrails` | Safety and operational guardrails | +| `kubernetes-context` | Kubernetes-specific operational context | +| `a2a-communication` | Agent-to-agent communication guidelines | + +## Usage + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: k8s-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + promptTemplate: + dataSources: + - configMapRef: + name: kagent-builtin-prompts + - configMapRef: + name: my-custom-prompts + systemMessage: | + You are a Kubernetes management agent named {{.AgentName}}. + + {{include "kagent-builtin-prompts/safety-guardrails"}} + {{include "kagent-builtin-prompts/tool-usage-best-practices"}} + {{include "my-custom-prompts/k8s-specific-rules"}} + + Your tools: {{.ToolNames}} + Your skills: {{.SkillNames}} +``` + +### Available Template Variables + +| Variable | Description | +|----------|-------------| +| `{{.AgentName}}` | Name of the Agent resource | +| `{{.AgentNamespace}}` | Namespace of the Agent resource | +| `{{.Description}}` | Agent description | +| `{{.ToolNames}}` | Comma-separated list of tool names | +| `{{.SkillNames}}` | Comma-separated list of skill names | + +### Creating Custom Prompt Templates + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-custom-prompts +data: + incident-response: | + ## Incident Response Guidelines + When responding to incidents: + 1. Assess the severity (P1-P4) + 2. Check affected services and dependencies + 3. Review recent deployments and changes + 4. Collect relevant logs and metrics + 5. Propose remediation steps +``` + +## How It Works + +1. The controller watches ConfigMaps referenced in `promptTemplate.dataSources` +2. During reconciliation, `{{include "configmap-name/key"}}` directives are resolved +3. Template variables are interpolated +4. The fully expanded system message is written to the ADK config +5. ConfigMap changes trigger automatic re-reconciliation + +> **Security Note:** Only ConfigMaps are supported as data sources — Secret references were intentionally excluded to avoid leaking sensitive data into prompts sent to LLM providers. diff --git a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx new file mode 100644 index 0000000..133b562 --- /dev/null +++ b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx @@ -0,0 +1,204 @@ +--- +title: "Tools Ecosystem" +pageOrder: 3 +description: "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." +--- + +export const metadata = { + title: "Tools Ecosystem", + description: "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts.", + author: "kagent.dev" +}; + +# Tools Ecosystem + +kagent provides a rich set of built-in tools through MCP (Model Context Protocol) servers, plus the ability to add custom tools. All tools are integrated via the kagent-tools package. + +## Built-in Tool Categories + +### Kubernetes + +Comprehensive cluster management tools: + +| Tool | Description | +|------|-------------| +| `kubectl_get` | Query resources (pods, deployments, services, etc.) | +| `kubectl_describe` | Detailed resource information | +| `kubectl_scale` | Scale deployments and statefulsets | +| `kubectl_patch` | Patch resources with strategic merge | +| `kubectl_label` | Add/remove labels | +| `kubectl_annotate` | Add/remove annotations | +| `kubectl_delete` | Delete resources | +| `kubectl_apply` | Apply YAML manifests | +| `kubectl_exec` | Execute commands in pods | +| `kubectl_logs` | Retrieve pod logs | +| `kubectl_events` | Get cluster events | +| `kubectl_connectivity_test` | Test service connectivity | + +### Helm + +| Tool | Description | +|------|-------------| +| `helm_list` | List installed releases | +| `helm_install` | Install a chart | +| `helm_upgrade` | Upgrade a release | +| `helm_uninstall` | Remove a release | +| `helm_repo_add` | Add chart repository | +| `helm_repo_update` | Update chart repositories | + +### Istio + +| Tool | Description | +|------|-------------| +| `istio_proxy_status` | Check proxy synchronization status | +| `istio_proxy_config` | Inspect proxy configuration | +| `istio_install` | Install Istio | +| `istio_manifest_generate` | Generate installation manifests | +| `istio_analyze` | Analyze Istio configuration for issues | +| `istio_version` | Get Istio version info | +| `istio_remote_clusters` | Manage remote cluster configuration | +| `istio_waypoint` | Manage waypoint proxies | + +### Argo Rollouts + +| Tool | Description | +|------|-------------| +| `argo_rollouts_verify` | Verify controller is running | +| `argo_rollouts_check_plugins` | Check installed plugins | +| `argo_rollouts_promote` | Promote a rollout | +| `argo_rollouts_pause` | Pause a rollout | +| `argo_rollouts_set_image` | Update rollout image | + +### Cilium + +| Tool | Description | +|------|-------------| +| `cilium_status` | Check Cilium status | +| `cilium_install` | Install Cilium | +| `cilium_upgrade` | Upgrade Cilium | +| `cilium_clustermesh` | Manage cluster mesh | +| `cilium_bgp_peers` | View BGP peers | +| `cilium_bgp_routes` | View BGP routes | + +### Prometheus + +| Tool | Description | +|------|-------------| +| `prometheus_query` | Execute instant PromQL queries | +| `prometheus_query_range` | Execute range PromQL queries | +| `prometheus_labels` | Discover available labels | +| `prometheus_targets` | List scrape targets and status | + +### Grafana + +| Tool | Description | +|------|-------------| +| `grafana_orgs` | Manage organizations | +| `grafana_dashboards` | List/manage dashboards | +| `grafana_alerts` | View/manage alerts | +| `grafana_datasources` | Manage data sources | + +### Utilities + +| Tool | Description | +|------|-------------| +| `datetime_format` | Format timestamps | +| `datetime_parse` | Parse date strings | +| `shell_execute` | Run shell commands | +| `docs_query` | Query product documentation | + +## Agent Built-in Tools + +These tools are automatically available to every agent (no configuration needed): + +| Tool | Description | +|------|-------------| +| `ask_user` | Pose questions to users with optional choices | +| `SkillsTool` | Discover and load skills | +| `BashTool` | Execute shell commands (Go ADK) | +| `ReadFile` | Read files with pagination (Go ADK) | +| `WriteFile` | Write file content (Go ADK) | +| `EditFile` | Edit files via string replacement (Go ADK) | + +## Configuring Tools on an Agent + +### Single MCP Server + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: k8s-agent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You manage Kubernetes clusters." + tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + kind: RemoteMCPServer + toolNames: + - kubectl_get + - kubectl_describe + - kubectl_logs + - kubectl_events +``` + +### With Tool Approval + +```yaml +tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + kind: RemoteMCPServer + toolNames: + - kubectl_get + - kubectl_describe + - kubectl_delete + - kubectl_apply + requireApproval: + - kubectl_delete + - kubectl_apply +``` + +### Agent as Tool (A2A) + +Use another agent as a tool via the A2A protocol: + +```yaml +tools: + - type: Agent + agent: + name: specialist-agent + namespace: default +``` + +## Community / Contrib MCP Servers + +Additional MCP servers available in `contrib/tools/`: + +| Server | Description | +|--------|-------------| +| **GitHub MCP Server** | GitHub Copilot MCP server with tools for issues, PRs, repos, actions, and more | +| **k8sgpt MCP Server** | K8sGPT integration for AI-powered Kubernetes diagnostics | +| **Grafana MCP** | Extended Grafana integration | + +## Read-Only Mode + +kagent-tools supports a read-only mode for safer operation: + +```yaml +# In Helm values +kagentTools: + readOnly: true # Disables all write/mutating operations +``` + +## Observability + +kagent-tools exposes Prometheus metrics for monitoring: +- Tool invocation counts +- Tool execution duration +- Error rates by tool diff --git a/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx b/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx new file mode 100644 index 0000000..98a859a --- /dev/null +++ b/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx @@ -0,0 +1,92 @@ +--- +title: "Agent Frameworks (BYO)" +pageOrder: 6 +description: "Bring your own agents with Google ADK, CrewAI, or LangGraph frameworks." +--- + +export const metadata = { + title: "Agent Frameworks (BYO)", + description: "Bring your own agents with Google ADK, CrewAI, or LangGraph frameworks.", + author: "kagent.dev" +}; + +# Agent Frameworks (BYO) + +Solo Enterprise for kagent supports multiple agent frameworks for bringing your own (BYO) agents. Unlike declarative agents defined entirely through kagent CRDs, BYO agents give you full control over agent logic. + +## Supported Frameworks + +| Framework | Description | +|-----------|-------------| +| **Google ADK** | Full control over agent behavior; well-suited for complex workflows | +| **CrewAI** | Multi-agent orchestration framework for collaborative AI agents | +| **LangGraph** | Graph-based agent framework from LangChain for stateful, multi-step workflows | + +## BYO Agent with ADK + +### Agent Resource + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: basic-agent + namespace: kagent +spec: + description: This agent can roll a die and determine if a number is prime. + type: BYO + byo: + deployment: + image: gcr.io/solo-public/docs/test-byo-agent:latest + cmd: "kagent-adk" + args: ["run", "basic", "--host", "0.0.0.0", "--port", "8080"] + env: + - name: GOOGLE_API_KEY + valueFrom: + secretKeyRef: + name: kagent-google + key: GOOGLE_API_KEY + - name: ADK_ALLOW_WIP_FEATURES + value: "true" +``` + +### A2A Protocol Endpoint + +BYO agents are exposed via the A2A protocol on port 8083: + +```bash +# Port-forward the A2A endpoint +kubectl port-forward svc/kagent-controller 8083:8083 -n kagent --context $MGMT_CONTEXT + +# Query the agent card +curl localhost:8083/api/a2a/kagent/basic-agent/.well-known/agent.json +``` + +### Invoking BYO Agents + +**Via Enterprise UI:** +Navigate to Agents, find your agent tile, and start chatting. + +**Via kagent CLI:** + +```bash +kagent invoke --agent basic-agent --task "Roll a die with 6 sides" +``` + +**Via A2A Host CLI:** + +```bash +git clone https://github.com/a2aproject/a2a-samples.git +cd a2a-samples/samples/python/hosts/cli +uv run . --agent http://127.0.0.1:8083/api/a2a/kagent/basic-agent +``` + +## Declarative vs BYO Agents + +| Aspect | Declarative | BYO | +|--------|------------|-----| +| Definition | kagent CRDs (system message, model, tools) | Custom container image | +| Control | kagent manages behavior | You manage agent logic | +| Framework | kagent ADK | ADK, CrewAI, LangGraph, or custom | +| Protocol | Internal | A2A protocol | +| Use case | Standard agents with tools | Complex workflows, custom integrations | diff --git a/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx b/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx new file mode 100644 index 0000000..fd6f0de --- /dev/null +++ b/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx @@ -0,0 +1,100 @@ +--- +title: "Enterprise UI" +pageOrder: 5 +description: "Interactive management dashboard for agents, tools, models, tracing, and cluster federation." +--- + +export const metadata = { + title: "Enterprise UI", + description: "Interactive management dashboard for agents, tools, models, tracing, and cluster federation.", + author: "kagent.dev" +}; + +# Enterprise UI + +Solo Enterprise for kagent includes an interactive management UI for managing agents, tools, models, and clusters across your federated environment. + +## Accessing the UI + +**Via LoadBalancer:** + +```bash +export UI_ADDRESS=$(kubectl get svc -n kagent solo-enterprise-ui \ + --context $MGMT_CONTEXT \ + -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") +open ${UI_ADDRESS} +``` + +**Via Port Forward:** + +```bash +kubectl port-forward service/solo-enterprise-ui -n kagent \ + --context $MGMT_CONTEXT 4000:80 & +# Open http://localhost:4000 +``` + +You can also expose the UI on a custom domain with HTTPS (e.g., `https://kagent.myapp.com`). + +## Authentication + +The UI requires OIDC authentication: + +- **Default auth IdP** — Automatically logged in as Admin user +- **Production** — Configure an external IdP (Keycloak, Okta, Entra ID, or Generic OIDC) +- Users must belong to a group mapped to at least a **Reader** role + +## Setup Wizard + +On first login, the UI presents a setup wizard: + +1. **Connected Clusters** — Review and register new workload clusters +2. **Models** — Review configured LLM models; add new models +3. **MCP Tools** — Review discovered MCP tools; add new tool servers +4. **OIDC Configuration** — Review IdP details +5. Click **Finish Enterprise Setup** to complete + +## Dashboard + +The Dashboard provides an overview of: + +- Total cluster, agent, model, and tool counts +- **Deployed Agent tiles** — Click any tile to start chatting with that agent + +## Agents Page + +- View all agents deployed across all clusters +- Click an agent tile to open the chat interface +- View Human-in-the-Loop approval requests during agent execution + +## Tracing Page + +End-to-end trace visualization: + +- **Time Range filter** — Filter spans by time window +- **Sortable trace list** — Sort by execution start time +- **Trace detail view** with three sub-views: + - **Execution Flow** — Interactive graph with play/stop replay + - **Trace Tree** — Timeline of agents, tools, and decision points + - **Agent Trace Details** — User input, agent output, metadata + +## Inventory + +### Models +View and add LLM models available in each cluster. Supported providers: OpenAI, Anthropic, Azure OpenAI, Google Gemini, Google Vertex AI, Amazon Bedrock, Ollama, BYO OpenAI-compatible. + +### Tools +View all MCP tools available to agents with descriptions. + +### Tool Servers +View and add tool servers providing MCP tools. + +### Clusters +View connected clusters with region and status filters. Register new clusters via the UI. + +## User Management + +| Role | Description | +|------|-------------| +| **Admin** | Full access to all features and user management | +| **Writer** | Create, modify, and delete agents, tools, models | +| **Reader** | View-only access to agents, tools, traces, dashboards | diff --git a/src/app/docs/kagent/enterprise/installation/page.mdx b/src/app/docs/kagent/enterprise/installation/page.mdx new file mode 100644 index 0000000..fe62391 --- /dev/null +++ b/src/app/docs/kagent/enterprise/installation/page.mdx @@ -0,0 +1,113 @@ +--- +title: "Installation & Operations" +pageOrder: 1 +description: "Install, upgrade, and manage Solo Enterprise for kagent across management and workload clusters." +--- + +export const metadata = { + title: "Installation & Operations", + description: "Install, upgrade, and manage Solo Enterprise for kagent across management and workload clusters.", + author: "kagent.dev" +}; + +# Installation & Operations + +Solo Enterprise for kagent provides a comprehensive installation process covering the management plane, workload clusters, Istio ambient mesh, and agentgateway. + +## Prerequisites + +- A Solo Enterprise for kagent license key (contact your Solo account representative) +- Kubernetes clusters for management and workload roles +- `helm` and `kubectl` CLI installed +- `kagent` CLI installed (optional, for agent invocation) + +## Installation Components + +The full installation includes these components in order: + +| Step | Component | Description | +|------|-----------|-------------| +| 1 | **Istio ambient mesh** | Service mesh for mTLS, policy enforcement, and multicluster connectivity | +| 2 | **Solo Enterprise for agentgateway** | Waypoint proxy for agent traffic policy enforcement | +| 3 | **Solo Enterprise for kagent** | Management plane (UI, OTel, ClickHouse) and workload plane (controller, agents, tools) | + +### Helm Charts + +| Chart | Registry | Purpose | +|-------|----------|---------| +| `kagent-enterprise` | `oci://us-docker.pkg.dev/solo-public/kagent-enterprise-helm/charts/kagent-enterprise` | Core kagent enterprise | +| `management` | Solo Enterprise Helm registry | Management plane components | +| `relay` | Solo Enterprise Helm registry | Workload cluster relay | +| Gloo Operator | Solo Enterprise Helm registry | Lifecycle operator | + +## Quick Start + +### Environment Setup + +```bash +export MGMT_CONTEXT= +export REMOTE_CONTEXT= +``` + +### Install kagent-enterprise + +```bash +helm upgrade -i kagent \ + oci://us-docker.pkg.dev/solo-public/kagent-enterprise-helm/charts/kagent-enterprise \ + --kube-context ${REMOTE_CONTEXT} \ + -n kagent --version 0.3.4 \ + -f workload-values.yaml +``` + +## Upgrade + +To upgrade Solo Enterprise for kagent: + +1. Review the changelog for the target version +2. Update Helm chart versions in your values files +3. Upgrade each component in order: + - Istio ambient mesh + - Solo Enterprise for agentgateway + - Solo Enterprise for kagent (management cluster first, then workload clusters) + +## Debugging + +### Check Pod Status + +```bash +kubectl get pods -n kagent --context $MGMT_CONTEXT +kubectl get pods -n kagent --context $REMOTE_CONTEXT +``` + +### Check Tunnel Connectivity + +```bash +# Management cluster - tunnel server +kubectl -n kagent port-forward deployment/solo-enterprise-ui 8080 --context $MGMT_CONTEXT +# Check http://localhost:8080/metrics for kagent_tunnel_server_tunnel_up + +# Workload cluster - tunnel client +kubectl -n kagent port-forward deployment/kagent-enterprise-agent 8080 --context $REMOTE_CONTEXT +# Check http://localhost:8080/metrics for kagent_tunnel_client_tunnel_up +``` + +### Check OTel Pipeline + +```bash +kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context $MGMT_CONTEXT +``` + +## Uninstall + +Remove components in reverse order: + +1. Solo Enterprise for kagent (workload clusters, then management cluster) +2. Solo Enterprise for agentgateway +3. Istio ambient mesh + +## Key Namespaces + +| Namespace | Purpose | +|-----------|---------| +| `kagent` | Main namespace for kagent controller, agents, tools, OTel config | +| `agentgateway-system` | Agentgateway components | diff --git a/src/app/docs/kagent/enterprise/model-providers/page.mdx b/src/app/docs/kagent/enterprise/model-providers/page.mdx new file mode 100644 index 0000000..e498dce --- /dev/null +++ b/src/app/docs/kagent/enterprise/model-providers/page.mdx @@ -0,0 +1,68 @@ +--- +title: "Model Providers" +pageOrder: 7 +description: "Configure and manage LLM providers across clusters: OpenAI, Anthropic, Azure, Gemini, Vertex AI, Bedrock, Ollama." +--- + +export const metadata = { + title: "Model Providers", + description: "Configure and manage LLM providers across clusters: OpenAI, Anthropic, Azure, Gemini, Vertex AI, Bedrock, Ollama.", + author: "kagent.dev" +}; + +# Model Providers + +Solo Enterprise for kagent supports a wide range of LLM providers. Models are configured per-cluster and per-namespace, and can be managed through the Enterprise UI or via Kubernetes resources. + +## Supported Providers + +| Provider | Auth Method | Description | +|----------|-------------|-------------| +| **OpenAI** | API key via Secret | GPT-4, GPT-4.1, GPT-4.1-mini | +| **Anthropic (Claude)** | API key via Secret | Claude 3.5, Claude 4 family | +| **Azure OpenAI** | Endpoint + API key | Azure-hosted OpenAI models | +| **Google Gemini** | API key via Secret | Gemini models via Google AI API | +| **Google Vertex AI** | Service account credentials | Gemini and other models via Vertex AI | +| **Amazon Bedrock** | AWS credentials | Claude, Titan, and other Bedrock models | +| **Ollama** | Base URL (local/remote) | Self-hosted open-source models | +| **BYO OpenAI-compatible** | Custom configuration | Any model with an OpenAI-compatible API | + +## Managing Models + +### Via Enterprise UI + +1. Navigate to **Inventory > Models** +2. Click **+ Add New Model** +3. Select the cluster and namespace +4. Choose the provider and model +5. Enter your API key or authentication parameters +6. Click **Create Model** + +### Via Kubernetes Resources + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: ModelConfig +metadata: + name: my-openai-model + namespace: kagent +spec: + provider: OpenAI + model: gpt-4.1-mini + apiKeySecretRef: + name: openai-key + key: api-key +``` + +```bash +kubectl create secret generic openai-key -n kagent \ + --from-literal=api-key=$OPENAI_API_KEY +``` + +## Multicluster Model Management + +Models are configured per-cluster. The Enterprise UI displays all models across all connected clusters, allowing you to: + +- View which models are available in which clusters +- Add new models to specific clusters +- Manage API keys and authentication centrally diff --git a/src/app/docs/kagent/enterprise/multicluster/page.mdx b/src/app/docs/kagent/enterprise/multicluster/page.mdx new file mode 100644 index 0000000..4d3cc82 --- /dev/null +++ b/src/app/docs/kagent/enterprise/multicluster/page.mdx @@ -0,0 +1,91 @@ +--- +title: "Multicluster Federation" +pageOrder: 3 +description: "Federated agent management across multiple Kubernetes clusters with a management-agent relay architecture." +--- + +export const metadata = { + title: "Multicluster Federation", + description: "Federated agent management across multiple Kubernetes clusters with a management-agent relay architecture.", + author: "kagent.dev" +}; + +# Multicluster Federation + +Solo Enterprise for kagent supports federated agent management across multiple Kubernetes clusters through a management-agent relay architecture. + +## Architecture + +The multicluster setup uses a hub-and-spoke model: + +``` + Management Cluster + solo-enterprise-ui + OTel GW + ClickHouse + kagent controller + Tunnel Server (receives connections) + | + Tunnel (relay) + | | + Workload Workload + Cluster 1 Cluster 2 + kagent- kagent- + enterprise enterprise + -agent (relay) -agent (relay) + Agents Agents +``` + +## Components + +### Management Cluster + +| Component | Description | +|-----------|-------------| +| `solo-enterprise-ui` | Enterprise management UI, OTel gateway, and ClickHouse telemetry storage | +| Tunnel Server | Accepts relay connections from workload clusters | +| kagent controller | Manages agent lifecycle, generates OBO tokens, serves JWKS endpoint | + +### Workload Clusters + +| Component | Description | +|-----------|-------------| +| `kagent-enterprise-agent` | Relay client that connects back to the management cluster tunnel server | +| OTel Collector | Collects telemetry data and sends to OTel gateway in management cluster | +| Agents | Agent pods running in the workload cluster | +| Agentgateway | Waypoint proxy for policy enforcement | + +## Tunnel Architecture + +The management-agent tunnel provides: + +- **Secure connectivity** between management and workload clusters +- **Telemetry relay** for forwarding OTel data to the management cluster +- **Agent federation** for managing agents across clusters from a single UI + +### Tunnel Metrics + +| Metric | Description | +|--------|-------------| +| `kagent_tunnel_server_tunnel_up` | Whether the tunnel server is running (gauge) | +| `kagent_tunnel_client_tunnel_up` | Whether the tunnel client is connected (gauge) | + +## Registering Clusters + +Register new workload clusters through the Enterprise UI: + +1. Navigate to **Inventory > Clusters** +2. Click **+ Register New Cluster** +3. Get the tunnel server endpoint: + ```bash + kubectl get svc -n kagent solo-enterprise-ui \ + --context ${MGMT_CONTEXT} \ + -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}" + ``` +4. Paste the endpoint and run the generated CLI commands + +## Multicluster Agent Communication + +With Istio ambient mesh deployed across clusters, agents communicate securely: + +- **mTLS** — Automatic mutual TLS between agents across clusters +- **Policy enforcement** — AccessPolicies apply across cluster boundaries +- **Traceable** — Cross-cluster agent interactions are captured in distributed traces diff --git a/src/app/docs/kagent/enterprise/observability/page.mdx b/src/app/docs/kagent/enterprise/observability/page.mdx new file mode 100644 index 0000000..7c9f6d7 --- /dev/null +++ b/src/app/docs/kagent/enterprise/observability/page.mdx @@ -0,0 +1,131 @@ +--- +title: "Observability" +pageOrder: 4 +description: "Built-in OpenTelemetry pipeline with distributed tracing, metrics, and interactive UI visualization." +--- + +export const metadata = { + title: "Observability", + description: "Built-in OpenTelemetry pipeline with distributed tracing, metrics, and interactive UI visualization.", + author: "kagent.dev" +}; + +# Observability + +Solo Enterprise for kagent provides a built-in OpenTelemetry (OTel) pipeline with distributed tracing, metrics, and an interactive UI for visualizing agent execution flows across federated clusters. + +## Architecture + +``` +Management Cluster + solo-enterprise-ui pod + UI container + opentelemetry-gateway container + ClickHouse (telemetry storage) + | + receives telemetry + | +Workload Cluster + kagent-enterprise-agent pod + opentelemetry-collector container +``` + +| Component | Location | Role | +|-----------|----------|------| +| OTel Gateway | Management cluster | Receives telemetry from all workload cluster collectors | +| OTel Collector | Each workload cluster | Scrapes and forwards telemetry data to the gateway | +| ClickHouse | Management cluster | Stores all telemetry data (traces, metrics) | + +## Distributed Tracing + +### What Traces Capture + +Traces provide complete execution paths for all agent interactions: + +- All LLM interactions (prompts sent and responses received) +- Tool invocations and their results +- Decision points the agent makes +- Cross-agent calls (A2A protocol flows) +- Cross-cluster execution paths + +### Enabling Tracing + +**Management cluster:** + +```yaml +otel: + tracing: + enabled: true + exporter: + otlp: + endpoint: solo-enterprise-ui.kagent.svc.cluster.local:4317 + insecure: true +``` + +**Workload cluster:** + +```yaml +otel: + tracing: + enabled: true + exporter: + otlp: + endpoint: kagent-enterprise-relay.kagent.svc.cluster.local:4317 + insecure: true +``` + +### Reviewing Traces in the UI + +1. Navigate to **Tracing** in the sidebar menu +2. Adjust the **Time Range** to filter spans +3. Click a trace ID to view the complete execution path + +Each trace provides three views: + +| View | Description | +|------|-------------| +| **Execution Flow** | Interactive graph visualization with play/stop replay controls | +| **Trace Tree** | Detailed timeline of agents, tools, and decision points | +| **Agent Trace Details** | User input, agent output, metadata (roles, tools, token usage) | + +## Metrics + +### Control Plane Metrics + +The management plane exposes metrics on port 8080: + +```bash +kubectl -n kagent port-forward deployment/solo-enterprise-ui 8080 \ + --context kind-mgmt-cluster +# Open http://localhost:8080/metrics +``` + +| Metric | Type | Description | +|--------|------|-------------| +| `kagent_tunnel_server_tunnel_up` | Gauge | Whether the tunnel server is running | + +### Data Plane Metrics + +Each workload cluster agent exposes metrics on port 8080: + +```bash +kubectl -n kagent port-forward deployment/kagent-enterprise-agent 8080 \ + --context kind-cluster-1 +# Open http://localhost:8080/metrics +``` + +| Metric | Type | Description | +|--------|------|-------------| +| `kagent_tunnel_client_tunnel_up` | Gauge | Whether the tunnel client is connected | + +## OTel Configuration + +View the default OTel configuration: + +```bash +# Management cluster +kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context kind-mgmt-cluster + +# Workload cluster +kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context kind-cluster-1 +``` diff --git a/src/app/docs/kagent/enterprise/page.mdx b/src/app/docs/kagent/enterprise/page.mdx new file mode 100644 index 0000000..6b058e0 --- /dev/null +++ b/src/app/docs/kagent/enterprise/page.mdx @@ -0,0 +1,58 @@ +--- +title: "Solo Enterprise for kagent" +pageOrder: 10 +description: "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability." +--- + +export const metadata = { + title: "Solo Enterprise for kagent", + description: "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability.", + author: "kagent.dev" +}; + +# Solo Enterprise for kagent + +Solo Enterprise for kagent is a hardened, production-ready distribution of the open-source kagent project, offered by Solo.io. It adds an enterprise management plane, advanced security, multicluster federation, and built-in observability. + +## Enterprise vs Open Source + +| Feature | Enterprise | Open Source | +|---------|-----------|-------------| +| Built-in agents and tools | Yes | Yes | +| Agent lifecycle management | Yes | Yes | +| BYO agent support (ADK, CrewAI, LangGraph) | Yes | Yes | +| BYO MCP tool servers | Yes | Yes | +| Multicluster and federated agent support | Yes | No | +| Built-in OTel pipeline for observability and tracing | Yes | No | +| Interactive UI with trace visualization | Yes | No | +| Security and access control (OIDC, RBAC) | Yes | No | +| Authorization policies (AccessPolicy) | Yes | No | +| On-behalf-of (OBO) token identity propagation | Yes | No | +| Agentgateway integration | Yes | No | +| Istio ambient mesh integration | Yes | No | +| FIPS and compliance builds | Yes | No | +| 24x7 production support | Yes | No | + +## Architecture + +``` +Management Cluster + solo-enterprise-ui (mgmt plane) + OTel Gateway (telemetry) + ClickHouse (storage) + kagent controller + Tunnel Server + | + Tunnel (relay) + | +Workload Cluster(s) + kagent-enterprise-agent (relay) + OTel Collector (telemetry) + agentgateway (waypoint proxy) + Agents (pods) + MCP Tool Servers +``` + +## Licensing + +Solo Enterprise for kagent requires a commercial license from Solo.io. Contact your Solo account representative to obtain a license key. diff --git a/src/app/docs/kagent/enterprise/security/page.mdx b/src/app/docs/kagent/enterprise/security/page.mdx new file mode 100644 index 0000000..c09e351 --- /dev/null +++ b/src/app/docs/kagent/enterprise/security/page.mdx @@ -0,0 +1,93 @@ +--- +title: "Security & Access Control" +pageOrder: 2 +description: "OIDC authentication, OBO token identity propagation, AccessPolicy authorization, and agentgateway enforcement." +--- + +export const metadata = { + title: "Security & Access Control", + description: "OIDC authentication, OBO token identity propagation, AccessPolicy authorization, and agentgateway enforcement.", + author: "kagent.dev" +}; + +# Security & Access Control + +Solo Enterprise for kagent provides a complete security stack: OIDC-based authentication, on-behalf-of (OBO) token identity propagation, fine-grained authorization via AccessPolicies, and network-level enforcement through agentgateway and Istio ambient mesh. + +## Security Architecture + +The security flow consists of three phases: + +``` +User --> IdP (OIDC) --> kagent controller --> agentgateway --> Agent/MCP Tool + | | | + 1. Authenticate 2. Generate OBO 3. Enforce + with IdP token AccessPolicy +``` + +### Phase 1: User Authentication (OIDC) + +Users authenticate through an OpenID Connect (OIDC) identity provider. The kagent controller validates the user's token using the IdP's public key. + +### Phase 2: Identity Propagation (OBO Tokens) + +After validating the user's OIDC token, the kagent controller generates an on-behalf-of (OBO) token. This token represents the agent's identity acting on behalf of the user, and is used for all downstream requests. + +Key details: +- The OBO token is signed by a private RSA signing key (2048-bit) provided via a `jwt` Kubernetes Secret +- Agentgateway validates via the JWKS endpoint (`/jwks.json`) on the kagent controller +- Standard JWT claims are validated: issuer, audience, expiration, not-before +- The `X-User-ID` header is set automatically on forwarded requests + +### Phase 3: Authorization (AccessPolicy) + +After OBO token validation, agentgateway evaluates `AccessPolicy` resources to determine whether the request should be allowed based on: +- **Subjects** — users and agents making requests +- **Targets** — agents and MCP servers being accessed + +## Supported Identity Providers + +| Provider | Description | +|----------|-------------| +| **Auto** | Default sample IdP for getting started | +| **Generic OIDC** | Any OpenID Connect-compliant provider | +| **Keycloak** | Open-source identity and access management | +| **Microsoft Entra ID** | Azure Active Directory | +| **Okta** | Enterprise identity management | + +## RBAC Roles + +| Role | Permissions | +|------|-------------| +| **Admin** | Full access to all features, user management, and configuration | +| **Writer** | Create, modify, and delete agents, tools, and models | +| **Reader** | View-only access to agents, tools, traces, and dashboards | + +Roles are mapped from IdP groups via the `rbac-config` ConfigMap using CEL expressions. + +## Network Enforcement with Agentgateway + +Because Solo Enterprise for agentgateway proxies traffic to agentic resources, you can set up: + +- **Timeouts** — Request timeouts for agent and tool calls +- **Retries** — Retry policies for resilience +- **mTLS** — Automatic mutual TLS via Istio ambient mesh +- **Policy enforcement** — Agentgateway acts as a waypoint proxy in the ambient mesh + +## Complete Security Flow + +``` +1. User --> IdP --> Login with credentials +2. IdP --> User --> Return user's OIDC token (signed by IdP key) +3. User --> kagent controller --> API request with OIDC token +4. kagent controller --> Validate OIDC token (using IdP public key) +5. kagent controller --> Generate OBO token (signed by kagent RSA key) +6. kagent controller --> agentgateway --> Forward request with OBO token +7. agentgateway --> kagent controller --> Fetch JWKS from /jwks.json +8. kagent controller --> agentgateway --> Return kagent's public key +9. agentgateway --> Verify JWT signature & validate claims +10. agentgateway --> Check AccessPolicy +11. agentgateway --> Agent/MCP Tool --> Forward request (if authorized) +12. Agent/MCP Tool --> agentgateway --> Response +13. agentgateway --> User --> Return response +``` diff --git a/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx b/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx new file mode 100644 index 0000000..4d4671c --- /dev/null +++ b/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx @@ -0,0 +1,82 @@ +--- +title: "Tools & MCP Servers" +pageOrder: 8 +description: "Built-in tools, Kubernetes services as MCP, remote MCP servers, and agents as tools." +--- + +export const metadata = { + title: "Tools & MCP Servers", + description: "Built-in tools, Kubernetes services as MCP, remote MCP servers, and agents as tools.", + author: "kagent.dev" +}; + +# Tools & MCP Servers + +Solo Enterprise for kagent provides multiple ways to integrate MCP (Model Context Protocol) tools with your agents. + +## Tool Types + +| Type | Description | +|------|-------------| +| **Built-in tools** | Pre-packaged tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, Argo Rollouts | +| **Kubernetes Services as MCP servers** | Discover HTTP tools from OpenAPI-compliant services | +| **Remote MCP servers** | Connect to external MCP-compatible tool servers | +| **Custom MCP servers** | Build your own MCP tool server from scratch | +| **Agents as tools** | Reference other agents as tools via A2A protocol | + +## Built-in Tools + +Comprehensive built-in tools for: + +- **Pod management and monitoring** — List, describe, get logs, exec into pods +- **Service discovery and configuration** — Query services, endpoints, configs +- **Helm operations** — Install, upgrade, uninstall releases +- **Istio operations** — Proxy status, config, analyze, install +- **Prometheus queries** — Instant and range PromQL queries +- **Grafana management** — Organizations, dashboards, alerts +- **Cilium operations** — Status, install, upgrade, cluster mesh +- **Argo Rollouts** — Verify, promote, pause, set image + +## Managing Tools via the UI + +1. Navigate to **Inventory > Tools** to view all discovered MCP tools +2. Navigate to **Inventory > Tool Servers** to view tool server configurations +3. Click **+ Add New Tool Server** to register a new server + +## Remote MCP Servers + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: RemoteMCPServer +metadata: + name: my-remote-server + namespace: kagent +spec: + protocol: SSE # or STREAMABLE_HTTP + url: http://my-mcp-server:8080/sse + headersFrom: + - secretRef: + name: server-auth-token + key: Authorization +``` + +## Agents as Tools + +Any agent can be used as a tool by other agents: + +```yaml +tools: + - type: Agent + agent: + name: specialist-agent + namespace: default +``` + +## Agentgateway Integration + +Agentgateway is built into the MCP tool servers, providing: + +- Secure communication +- AccessPolicy enforcement +- Timeout and retry policies +- Network-level observability diff --git a/src/app/docs/kagent/resources/agent-crd-reference/page.mdx b/src/app/docs/kagent/resources/agent-crd-reference/page.mdx new file mode 100644 index 0000000..33dbde2 --- /dev/null +++ b/src/app/docs/kagent/resources/agent-crd-reference/page.mdx @@ -0,0 +1,194 @@ +--- +title: "Agent CRD Reference" +pageOrder: 2 +description: "Complete reference for the kagent Agent Custom Resource Definition (v1alpha2)." +--- + +export const metadata = { + title: "Agent CRD Reference", + description: "Complete reference for the kagent Agent Custom Resource Definition (v1alpha2).", + author: "kagent.dev" +}; + +# Agent CRD Reference + +Complete reference for the kagent Agent Custom Resource Definition (v1alpha2). + +## Agent Resource + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: + namespace: +spec: + type: Declarative | BYO + declarative: + byo: + skills: + allowedNamespaces: [] +``` + +## DeclarativeAgentSpec + +```yaml +declarative: + runtime: python | go + modelConfig: + systemMessage: + promptTemplate: + dataSources: + - configMapRef: + name: + tools: + - type: McpServer | Agent + mcpServer: + agent: + a2aServer: + enabled: + port: + memory: + enabled: + embeddingProvider: + type: + model: + secretRef: + name: + context: + eventsCompaction: + enabled: + deployment: +``` + +## McpServerTool + +```yaml +mcpServer: + name: + kind: RemoteMCPServer | MCPServer + toolNames: + - + requireApproval: + - + propagateHeaders: + enabled: +``` + +## AgentTool + +```yaml +agent: + name: + namespace: +``` + +## SkillForAgent + +```yaml +skills: + refs: + - image: + gitRefs: + - url: + ref: + path: + name: + gitAuthSecretRef: + name: + insecureSkipVerify: +``` + +## SharedDeploymentSpec + +```yaml +deployment: + replicas: + imageRegistry: + resources: + requests: + cpu: + memory: + limits: + cpu: + memory: + tolerations: [] + affinity: + nodeSelector: + securityContext: + serviceAccountName: + volumes: [] + volumeMounts: [] + imagePullPolicy: + imagePullSecrets: [] +``` + +## ModelConfig Resource + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: ModelConfig +metadata: + name: +spec: + provider: OpenAI | Anthropic | Gemini | GeminiVertexAI | AnthropicVertexAI | AzureOpenAI | Bedrock | Ollama + model: + apiKeySecret: + apiKeySecretKey: + baseURL: + azureEndpoint: + region: +``` + +## RemoteMCPServer Resource + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: RemoteMCPServer +metadata: + name: +spec: + protocol: SSE | STREAMABLE_HTTP + url: + headersFrom: + - secretRef: + name: + key: +status: + discoveredTools: [] +``` + +## MCPServer Resource (kmcp) + +```yaml +apiVersion: kagent.dev/v1alpha1 +kind: MCPServer +metadata: + name: +spec: + deployment: + image: + cmd: + args: [] + port: + secretRefs: + - name: + transportType: stdio +``` + +## ModelProviderConfig Resource + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: ModelProviderConfig +metadata: + name: +spec: + provider: OpenAI | Anthropic | Gemini | ... + apiKeySecretRef: + name: + key: +status: + discoveredModels: [] + ready: +``` diff --git a/src/config/navigation.json b/src/config/navigation.json index 98dcb2c..50ef686 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -83,6 +83,41 @@ "title": "Tools", "href": "/docs/kagent/concepts/tools", "description": "Understand the different types of tools kagent can use, including built-in, MCP, and HTTP tools, and how tool discovery works." + }, + { + "title": "Tools Ecosystem", + "href": "/docs/kagent/concepts/tools-ecosystem", + "description": "Comprehensive catalog of built-in tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." + }, + { + "title": "Human-in-the-Loop", + "href": "/docs/kagent/concepts/human-in-the-loop", + "description": "Configure tool approval gates and interactive user prompts for agent oversight." + }, + { + "title": "Agent Memory", + "href": "/docs/kagent/concepts/agent-memory", + "description": "Enable vector-backed long-term memory for agents using pgvector or Turso." + }, + { + "title": "Prompt Templates", + "href": "/docs/kagent/concepts/prompt-templates", + "description": "Compose reusable prompt fragments from ConfigMaps using Go template syntax." + }, + { + "title": "Multi-Runtime Support", + "href": "/docs/kagent/concepts/multi-runtime", + "description": "Choose between Go and Python ADK runtimes for your agents." + }, + { + "title": "Git-Based Skills", + "href": "/docs/kagent/concepts/git-based-skills", + "description": "Load markdown knowledge documents from Git repositories to guide agent behavior." + }, + { + "title": "Context Management", + "href": "/docs/kagent/concepts/context-management", + "description": "Automatically summarize older messages to stay within LLM context windows." } ] }, @@ -254,6 +289,11 @@ "href": "/docs/kagent/resources/helm", "description": "kagent Helm chart configuration reference" }, + { + "title": "Agent CRD Reference", + "href": "/docs/kagent/resources/agent-crd-reference", + "description": "Complete reference for the Agent, ModelConfig, RemoteMCPServer, MCPServer, and ModelProviderConfig CRDs." + }, { "title": "FAQs", "href": "/docs/kagent/resources/faq", @@ -266,6 +306,53 @@ } ] } + { + "title": "Solo Enterprise", + "href": "/docs/kagent/enterprise", + "description": "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability.", + "items": [ + { + "title": "Installation & Operations", + "href": "/docs/kagent/enterprise/installation", + "description": "Install, upgrade, and manage Solo Enterprise for kagent." + }, + { + "title": "Security & Access Control", + "href": "/docs/kagent/enterprise/security", + "description": "OIDC authentication, OBO tokens, AccessPolicy, and agentgateway enforcement." + }, + { + "title": "Multicluster Federation", + "href": "/docs/kagent/enterprise/multicluster", + "description": "Management-agent relay architecture for federated agent management." + }, + { + "title": "Observability", + "href": "/docs/kagent/enterprise/observability", + "description": "Built-in OTel pipeline, distributed tracing, metrics, and ClickHouse storage." + }, + { + "title": "Enterprise UI", + "href": "/docs/kagent/enterprise/enterprise-ui", + "description": "Interactive dashboard for agents, tools, models, tracing, and cluster management." + }, + { + "title": "Agent Frameworks (BYO)", + "href": "/docs/kagent/enterprise/agent-frameworks", + "description": "Bring your own agents with Google ADK, CrewAI, or LangGraph." + }, + { + "title": "Model Providers", + "href": "/docs/kagent/enterprise/model-providers", + "description": "Configure LLM providers across clusters." + }, + { + "title": "Tools & MCP Servers", + "href": "/docs/kagent/enterprise/tools-mcp-servers", + "description": "Built-in tools, remote MCP servers, and agents as tools." + } + ] + } ] }, { From 8cfb76da90b49bdc78196f860410de2a4ed89214 Mon Sep 17 00:00:00 2001 From: Sebastian Maniak Date: Mon, 9 Mar 2026 16:28:03 -0400 Subject: [PATCH 02/27] docs: remove CRD reference and enterprise pages, keep only core concepts Co-Authored-By: Claude Opus 4.6 Signed-off-by: Art Berger --- .../enterprise/agent-frameworks/page.mdx | 92 --------- .../kagent/enterprise/enterprise-ui/page.mdx | 100 --------- .../kagent/enterprise/installation/page.mdx | 113 ---------- .../enterprise/model-providers/page.mdx | 68 ------ .../kagent/enterprise/multicluster/page.mdx | 91 -------- .../kagent/enterprise/observability/page.mdx | 131 ------------ src/app/docs/kagent/enterprise/page.mdx | 58 ------ .../docs/kagent/enterprise/security/page.mdx | 93 --------- .../enterprise/tools-mcp-servers/page.mdx | 82 -------- .../resources/agent-crd-reference/page.mdx | 194 ------------------ src/config/navigation.json | 54 +---- 11 files changed, 1 insertion(+), 1075 deletions(-) delete mode 100644 src/app/docs/kagent/enterprise/agent-frameworks/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/enterprise-ui/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/installation/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/model-providers/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/multicluster/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/observability/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/security/page.mdx delete mode 100644 src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx delete mode 100644 src/app/docs/kagent/resources/agent-crd-reference/page.mdx diff --git a/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx b/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx deleted file mode 100644 index 98a859a..0000000 --- a/src/app/docs/kagent/enterprise/agent-frameworks/page.mdx +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: "Agent Frameworks (BYO)" -pageOrder: 6 -description: "Bring your own agents with Google ADK, CrewAI, or LangGraph frameworks." ---- - -export const metadata = { - title: "Agent Frameworks (BYO)", - description: "Bring your own agents with Google ADK, CrewAI, or LangGraph frameworks.", - author: "kagent.dev" -}; - -# Agent Frameworks (BYO) - -Solo Enterprise for kagent supports multiple agent frameworks for bringing your own (BYO) agents. Unlike declarative agents defined entirely through kagent CRDs, BYO agents give you full control over agent logic. - -## Supported Frameworks - -| Framework | Description | -|-----------|-------------| -| **Google ADK** | Full control over agent behavior; well-suited for complex workflows | -| **CrewAI** | Multi-agent orchestration framework for collaborative AI agents | -| **LangGraph** | Graph-based agent framework from LangChain for stateful, multi-step workflows | - -## BYO Agent with ADK - -### Agent Resource - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: basic-agent - namespace: kagent -spec: - description: This agent can roll a die and determine if a number is prime. - type: BYO - byo: - deployment: - image: gcr.io/solo-public/docs/test-byo-agent:latest - cmd: "kagent-adk" - args: ["run", "basic", "--host", "0.0.0.0", "--port", "8080"] - env: - - name: GOOGLE_API_KEY - valueFrom: - secretKeyRef: - name: kagent-google - key: GOOGLE_API_KEY - - name: ADK_ALLOW_WIP_FEATURES - value: "true" -``` - -### A2A Protocol Endpoint - -BYO agents are exposed via the A2A protocol on port 8083: - -```bash -# Port-forward the A2A endpoint -kubectl port-forward svc/kagent-controller 8083:8083 -n kagent --context $MGMT_CONTEXT - -# Query the agent card -curl localhost:8083/api/a2a/kagent/basic-agent/.well-known/agent.json -``` - -### Invoking BYO Agents - -**Via Enterprise UI:** -Navigate to Agents, find your agent tile, and start chatting. - -**Via kagent CLI:** - -```bash -kagent invoke --agent basic-agent --task "Roll a die with 6 sides" -``` - -**Via A2A Host CLI:** - -```bash -git clone https://github.com/a2aproject/a2a-samples.git -cd a2a-samples/samples/python/hosts/cli -uv run . --agent http://127.0.0.1:8083/api/a2a/kagent/basic-agent -``` - -## Declarative vs BYO Agents - -| Aspect | Declarative | BYO | -|--------|------------|-----| -| Definition | kagent CRDs (system message, model, tools) | Custom container image | -| Control | kagent manages behavior | You manage agent logic | -| Framework | kagent ADK | ADK, CrewAI, LangGraph, or custom | -| Protocol | Internal | A2A protocol | -| Use case | Standard agents with tools | Complex workflows, custom integrations | diff --git a/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx b/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx deleted file mode 100644 index fd6f0de..0000000 --- a/src/app/docs/kagent/enterprise/enterprise-ui/page.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "Enterprise UI" -pageOrder: 5 -description: "Interactive management dashboard for agents, tools, models, tracing, and cluster federation." ---- - -export const metadata = { - title: "Enterprise UI", - description: "Interactive management dashboard for agents, tools, models, tracing, and cluster federation.", - author: "kagent.dev" -}; - -# Enterprise UI - -Solo Enterprise for kagent includes an interactive management UI for managing agents, tools, models, and clusters across your federated environment. - -## Accessing the UI - -**Via LoadBalancer:** - -```bash -export UI_ADDRESS=$(kubectl get svc -n kagent solo-enterprise-ui \ - --context $MGMT_CONTEXT \ - -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}") -open ${UI_ADDRESS} -``` - -**Via Port Forward:** - -```bash -kubectl port-forward service/solo-enterprise-ui -n kagent \ - --context $MGMT_CONTEXT 4000:80 & -# Open http://localhost:4000 -``` - -You can also expose the UI on a custom domain with HTTPS (e.g., `https://kagent.myapp.com`). - -## Authentication - -The UI requires OIDC authentication: - -- **Default auth IdP** — Automatically logged in as Admin user -- **Production** — Configure an external IdP (Keycloak, Okta, Entra ID, or Generic OIDC) -- Users must belong to a group mapped to at least a **Reader** role - -## Setup Wizard - -On first login, the UI presents a setup wizard: - -1. **Connected Clusters** — Review and register new workload clusters -2. **Models** — Review configured LLM models; add new models -3. **MCP Tools** — Review discovered MCP tools; add new tool servers -4. **OIDC Configuration** — Review IdP details -5. Click **Finish Enterprise Setup** to complete - -## Dashboard - -The Dashboard provides an overview of: - -- Total cluster, agent, model, and tool counts -- **Deployed Agent tiles** — Click any tile to start chatting with that agent - -## Agents Page - -- View all agents deployed across all clusters -- Click an agent tile to open the chat interface -- View Human-in-the-Loop approval requests during agent execution - -## Tracing Page - -End-to-end trace visualization: - -- **Time Range filter** — Filter spans by time window -- **Sortable trace list** — Sort by execution start time -- **Trace detail view** with three sub-views: - - **Execution Flow** — Interactive graph with play/stop replay - - **Trace Tree** — Timeline of agents, tools, and decision points - - **Agent Trace Details** — User input, agent output, metadata - -## Inventory - -### Models -View and add LLM models available in each cluster. Supported providers: OpenAI, Anthropic, Azure OpenAI, Google Gemini, Google Vertex AI, Amazon Bedrock, Ollama, BYO OpenAI-compatible. - -### Tools -View all MCP tools available to agents with descriptions. - -### Tool Servers -View and add tool servers providing MCP tools. - -### Clusters -View connected clusters with region and status filters. Register new clusters via the UI. - -## User Management - -| Role | Description | -|------|-------------| -| **Admin** | Full access to all features and user management | -| **Writer** | Create, modify, and delete agents, tools, models | -| **Reader** | View-only access to agents, tools, traces, dashboards | diff --git a/src/app/docs/kagent/enterprise/installation/page.mdx b/src/app/docs/kagent/enterprise/installation/page.mdx deleted file mode 100644 index fe62391..0000000 --- a/src/app/docs/kagent/enterprise/installation/page.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: "Installation & Operations" -pageOrder: 1 -description: "Install, upgrade, and manage Solo Enterprise for kagent across management and workload clusters." ---- - -export const metadata = { - title: "Installation & Operations", - description: "Install, upgrade, and manage Solo Enterprise for kagent across management and workload clusters.", - author: "kagent.dev" -}; - -# Installation & Operations - -Solo Enterprise for kagent provides a comprehensive installation process covering the management plane, workload clusters, Istio ambient mesh, and agentgateway. - -## Prerequisites - -- A Solo Enterprise for kagent license key (contact your Solo account representative) -- Kubernetes clusters for management and workload roles -- `helm` and `kubectl` CLI installed -- `kagent` CLI installed (optional, for agent invocation) - -## Installation Components - -The full installation includes these components in order: - -| Step | Component | Description | -|------|-----------|-------------| -| 1 | **Istio ambient mesh** | Service mesh for mTLS, policy enforcement, and multicluster connectivity | -| 2 | **Solo Enterprise for agentgateway** | Waypoint proxy for agent traffic policy enforcement | -| 3 | **Solo Enterprise for kagent** | Management plane (UI, OTel, ClickHouse) and workload plane (controller, agents, tools) | - -### Helm Charts - -| Chart | Registry | Purpose | -|-------|----------|---------| -| `kagent-enterprise` | `oci://us-docker.pkg.dev/solo-public/kagent-enterprise-helm/charts/kagent-enterprise` | Core kagent enterprise | -| `management` | Solo Enterprise Helm registry | Management plane components | -| `relay` | Solo Enterprise Helm registry | Workload cluster relay | -| Gloo Operator | Solo Enterprise Helm registry | Lifecycle operator | - -## Quick Start - -### Environment Setup - -```bash -export MGMT_CONTEXT= -export REMOTE_CONTEXT= -``` - -### Install kagent-enterprise - -```bash -helm upgrade -i kagent \ - oci://us-docker.pkg.dev/solo-public/kagent-enterprise-helm/charts/kagent-enterprise \ - --kube-context ${REMOTE_CONTEXT} \ - -n kagent --version 0.3.4 \ - -f workload-values.yaml -``` - -## Upgrade - -To upgrade Solo Enterprise for kagent: - -1. Review the changelog for the target version -2. Update Helm chart versions in your values files -3. Upgrade each component in order: - - Istio ambient mesh - - Solo Enterprise for agentgateway - - Solo Enterprise for kagent (management cluster first, then workload clusters) - -## Debugging - -### Check Pod Status - -```bash -kubectl get pods -n kagent --context $MGMT_CONTEXT -kubectl get pods -n kagent --context $REMOTE_CONTEXT -``` - -### Check Tunnel Connectivity - -```bash -# Management cluster - tunnel server -kubectl -n kagent port-forward deployment/solo-enterprise-ui 8080 --context $MGMT_CONTEXT -# Check http://localhost:8080/metrics for kagent_tunnel_server_tunnel_up - -# Workload cluster - tunnel client -kubectl -n kagent port-forward deployment/kagent-enterprise-agent 8080 --context $REMOTE_CONTEXT -# Check http://localhost:8080/metrics for kagent_tunnel_client_tunnel_up -``` - -### Check OTel Pipeline - -```bash -kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context $MGMT_CONTEXT -``` - -## Uninstall - -Remove components in reverse order: - -1. Solo Enterprise for kagent (workload clusters, then management cluster) -2. Solo Enterprise for agentgateway -3. Istio ambient mesh - -## Key Namespaces - -| Namespace | Purpose | -|-----------|---------| -| `kagent` | Main namespace for kagent controller, agents, tools, OTel config | -| `agentgateway-system` | Agentgateway components | diff --git a/src/app/docs/kagent/enterprise/model-providers/page.mdx b/src/app/docs/kagent/enterprise/model-providers/page.mdx deleted file mode 100644 index e498dce..0000000 --- a/src/app/docs/kagent/enterprise/model-providers/page.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Model Providers" -pageOrder: 7 -description: "Configure and manage LLM providers across clusters: OpenAI, Anthropic, Azure, Gemini, Vertex AI, Bedrock, Ollama." ---- - -export const metadata = { - title: "Model Providers", - description: "Configure and manage LLM providers across clusters: OpenAI, Anthropic, Azure, Gemini, Vertex AI, Bedrock, Ollama.", - author: "kagent.dev" -}; - -# Model Providers - -Solo Enterprise for kagent supports a wide range of LLM providers. Models are configured per-cluster and per-namespace, and can be managed through the Enterprise UI or via Kubernetes resources. - -## Supported Providers - -| Provider | Auth Method | Description | -|----------|-------------|-------------| -| **OpenAI** | API key via Secret | GPT-4, GPT-4.1, GPT-4.1-mini | -| **Anthropic (Claude)** | API key via Secret | Claude 3.5, Claude 4 family | -| **Azure OpenAI** | Endpoint + API key | Azure-hosted OpenAI models | -| **Google Gemini** | API key via Secret | Gemini models via Google AI API | -| **Google Vertex AI** | Service account credentials | Gemini and other models via Vertex AI | -| **Amazon Bedrock** | AWS credentials | Claude, Titan, and other Bedrock models | -| **Ollama** | Base URL (local/remote) | Self-hosted open-source models | -| **BYO OpenAI-compatible** | Custom configuration | Any model with an OpenAI-compatible API | - -## Managing Models - -### Via Enterprise UI - -1. Navigate to **Inventory > Models** -2. Click **+ Add New Model** -3. Select the cluster and namespace -4. Choose the provider and model -5. Enter your API key or authentication parameters -6. Click **Create Model** - -### Via Kubernetes Resources - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: ModelConfig -metadata: - name: my-openai-model - namespace: kagent -spec: - provider: OpenAI - model: gpt-4.1-mini - apiKeySecretRef: - name: openai-key - key: api-key -``` - -```bash -kubectl create secret generic openai-key -n kagent \ - --from-literal=api-key=$OPENAI_API_KEY -``` - -## Multicluster Model Management - -Models are configured per-cluster. The Enterprise UI displays all models across all connected clusters, allowing you to: - -- View which models are available in which clusters -- Add new models to specific clusters -- Manage API keys and authentication centrally diff --git a/src/app/docs/kagent/enterprise/multicluster/page.mdx b/src/app/docs/kagent/enterprise/multicluster/page.mdx deleted file mode 100644 index 4d3cc82..0000000 --- a/src/app/docs/kagent/enterprise/multicluster/page.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: "Multicluster Federation" -pageOrder: 3 -description: "Federated agent management across multiple Kubernetes clusters with a management-agent relay architecture." ---- - -export const metadata = { - title: "Multicluster Federation", - description: "Federated agent management across multiple Kubernetes clusters with a management-agent relay architecture.", - author: "kagent.dev" -}; - -# Multicluster Federation - -Solo Enterprise for kagent supports federated agent management across multiple Kubernetes clusters through a management-agent relay architecture. - -## Architecture - -The multicluster setup uses a hub-and-spoke model: - -``` - Management Cluster - solo-enterprise-ui + OTel GW + ClickHouse - kagent controller - Tunnel Server (receives connections) - | - Tunnel (relay) - | | - Workload Workload - Cluster 1 Cluster 2 - kagent- kagent- - enterprise enterprise - -agent (relay) -agent (relay) - Agents Agents -``` - -## Components - -### Management Cluster - -| Component | Description | -|-----------|-------------| -| `solo-enterprise-ui` | Enterprise management UI, OTel gateway, and ClickHouse telemetry storage | -| Tunnel Server | Accepts relay connections from workload clusters | -| kagent controller | Manages agent lifecycle, generates OBO tokens, serves JWKS endpoint | - -### Workload Clusters - -| Component | Description | -|-----------|-------------| -| `kagent-enterprise-agent` | Relay client that connects back to the management cluster tunnel server | -| OTel Collector | Collects telemetry data and sends to OTel gateway in management cluster | -| Agents | Agent pods running in the workload cluster | -| Agentgateway | Waypoint proxy for policy enforcement | - -## Tunnel Architecture - -The management-agent tunnel provides: - -- **Secure connectivity** between management and workload clusters -- **Telemetry relay** for forwarding OTel data to the management cluster -- **Agent federation** for managing agents across clusters from a single UI - -### Tunnel Metrics - -| Metric | Description | -|--------|-------------| -| `kagent_tunnel_server_tunnel_up` | Whether the tunnel server is running (gauge) | -| `kagent_tunnel_client_tunnel_up` | Whether the tunnel client is connected (gauge) | - -## Registering Clusters - -Register new workload clusters through the Enterprise UI: - -1. Navigate to **Inventory > Clusters** -2. Click **+ Register New Cluster** -3. Get the tunnel server endpoint: - ```bash - kubectl get svc -n kagent solo-enterprise-ui \ - --context ${MGMT_CONTEXT} \ - -o jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}" - ``` -4. Paste the endpoint and run the generated CLI commands - -## Multicluster Agent Communication - -With Istio ambient mesh deployed across clusters, agents communicate securely: - -- **mTLS** — Automatic mutual TLS between agents across clusters -- **Policy enforcement** — AccessPolicies apply across cluster boundaries -- **Traceable** — Cross-cluster agent interactions are captured in distributed traces diff --git a/src/app/docs/kagent/enterprise/observability/page.mdx b/src/app/docs/kagent/enterprise/observability/page.mdx deleted file mode 100644 index 7c9f6d7..0000000 --- a/src/app/docs/kagent/enterprise/observability/page.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: "Observability" -pageOrder: 4 -description: "Built-in OpenTelemetry pipeline with distributed tracing, metrics, and interactive UI visualization." ---- - -export const metadata = { - title: "Observability", - description: "Built-in OpenTelemetry pipeline with distributed tracing, metrics, and interactive UI visualization.", - author: "kagent.dev" -}; - -# Observability - -Solo Enterprise for kagent provides a built-in OpenTelemetry (OTel) pipeline with distributed tracing, metrics, and an interactive UI for visualizing agent execution flows across federated clusters. - -## Architecture - -``` -Management Cluster - solo-enterprise-ui pod - UI container - opentelemetry-gateway container - ClickHouse (telemetry storage) - | - receives telemetry - | -Workload Cluster - kagent-enterprise-agent pod - opentelemetry-collector container -``` - -| Component | Location | Role | -|-----------|----------|------| -| OTel Gateway | Management cluster | Receives telemetry from all workload cluster collectors | -| OTel Collector | Each workload cluster | Scrapes and forwards telemetry data to the gateway | -| ClickHouse | Management cluster | Stores all telemetry data (traces, metrics) | - -## Distributed Tracing - -### What Traces Capture - -Traces provide complete execution paths for all agent interactions: - -- All LLM interactions (prompts sent and responses received) -- Tool invocations and their results -- Decision points the agent makes -- Cross-agent calls (A2A protocol flows) -- Cross-cluster execution paths - -### Enabling Tracing - -**Management cluster:** - -```yaml -otel: - tracing: - enabled: true - exporter: - otlp: - endpoint: solo-enterprise-ui.kagent.svc.cluster.local:4317 - insecure: true -``` - -**Workload cluster:** - -```yaml -otel: - tracing: - enabled: true - exporter: - otlp: - endpoint: kagent-enterprise-relay.kagent.svc.cluster.local:4317 - insecure: true -``` - -### Reviewing Traces in the UI - -1. Navigate to **Tracing** in the sidebar menu -2. Adjust the **Time Range** to filter spans -3. Click a trace ID to view the complete execution path - -Each trace provides three views: - -| View | Description | -|------|-------------| -| **Execution Flow** | Interactive graph visualization with play/stop replay controls | -| **Trace Tree** | Detailed timeline of agents, tools, and decision points | -| **Agent Trace Details** | User input, agent output, metadata (roles, tools, token usage) | - -## Metrics - -### Control Plane Metrics - -The management plane exposes metrics on port 8080: - -```bash -kubectl -n kagent port-forward deployment/solo-enterprise-ui 8080 \ - --context kind-mgmt-cluster -# Open http://localhost:8080/metrics -``` - -| Metric | Type | Description | -|--------|------|-------------| -| `kagent_tunnel_server_tunnel_up` | Gauge | Whether the tunnel server is running | - -### Data Plane Metrics - -Each workload cluster agent exposes metrics on port 8080: - -```bash -kubectl -n kagent port-forward deployment/kagent-enterprise-agent 8080 \ - --context kind-cluster-1 -# Open http://localhost:8080/metrics -``` - -| Metric | Type | Description | -|--------|------|-------------| -| `kagent_tunnel_client_tunnel_up` | Gauge | Whether the tunnel client is connected | - -## OTel Configuration - -View the default OTel configuration: - -```bash -# Management cluster -kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context kind-mgmt-cluster - -# Workload cluster -kubectl get cm kagent-enterprise-otel-config -n kagent -o yaml --context kind-cluster-1 -``` diff --git a/src/app/docs/kagent/enterprise/page.mdx b/src/app/docs/kagent/enterprise/page.mdx deleted file mode 100644 index 6b058e0..0000000 --- a/src/app/docs/kagent/enterprise/page.mdx +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Solo Enterprise for kagent" -pageOrder: 10 -description: "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability." ---- - -export const metadata = { - title: "Solo Enterprise for kagent", - description: "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability.", - author: "kagent.dev" -}; - -# Solo Enterprise for kagent - -Solo Enterprise for kagent is a hardened, production-ready distribution of the open-source kagent project, offered by Solo.io. It adds an enterprise management plane, advanced security, multicluster federation, and built-in observability. - -## Enterprise vs Open Source - -| Feature | Enterprise | Open Source | -|---------|-----------|-------------| -| Built-in agents and tools | Yes | Yes | -| Agent lifecycle management | Yes | Yes | -| BYO agent support (ADK, CrewAI, LangGraph) | Yes | Yes | -| BYO MCP tool servers | Yes | Yes | -| Multicluster and federated agent support | Yes | No | -| Built-in OTel pipeline for observability and tracing | Yes | No | -| Interactive UI with trace visualization | Yes | No | -| Security and access control (OIDC, RBAC) | Yes | No | -| Authorization policies (AccessPolicy) | Yes | No | -| On-behalf-of (OBO) token identity propagation | Yes | No | -| Agentgateway integration | Yes | No | -| Istio ambient mesh integration | Yes | No | -| FIPS and compliance builds | Yes | No | -| 24x7 production support | Yes | No | - -## Architecture - -``` -Management Cluster - solo-enterprise-ui (mgmt plane) - OTel Gateway (telemetry) - ClickHouse (storage) - kagent controller - Tunnel Server - | - Tunnel (relay) - | -Workload Cluster(s) - kagent-enterprise-agent (relay) - OTel Collector (telemetry) - agentgateway (waypoint proxy) - Agents (pods) - MCP Tool Servers -``` - -## Licensing - -Solo Enterprise for kagent requires a commercial license from Solo.io. Contact your Solo account representative to obtain a license key. diff --git a/src/app/docs/kagent/enterprise/security/page.mdx b/src/app/docs/kagent/enterprise/security/page.mdx deleted file mode 100644 index c09e351..0000000 --- a/src/app/docs/kagent/enterprise/security/page.mdx +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: "Security & Access Control" -pageOrder: 2 -description: "OIDC authentication, OBO token identity propagation, AccessPolicy authorization, and agentgateway enforcement." ---- - -export const metadata = { - title: "Security & Access Control", - description: "OIDC authentication, OBO token identity propagation, AccessPolicy authorization, and agentgateway enforcement.", - author: "kagent.dev" -}; - -# Security & Access Control - -Solo Enterprise for kagent provides a complete security stack: OIDC-based authentication, on-behalf-of (OBO) token identity propagation, fine-grained authorization via AccessPolicies, and network-level enforcement through agentgateway and Istio ambient mesh. - -## Security Architecture - -The security flow consists of three phases: - -``` -User --> IdP (OIDC) --> kagent controller --> agentgateway --> Agent/MCP Tool - | | | - 1. Authenticate 2. Generate OBO 3. Enforce - with IdP token AccessPolicy -``` - -### Phase 1: User Authentication (OIDC) - -Users authenticate through an OpenID Connect (OIDC) identity provider. The kagent controller validates the user's token using the IdP's public key. - -### Phase 2: Identity Propagation (OBO Tokens) - -After validating the user's OIDC token, the kagent controller generates an on-behalf-of (OBO) token. This token represents the agent's identity acting on behalf of the user, and is used for all downstream requests. - -Key details: -- The OBO token is signed by a private RSA signing key (2048-bit) provided via a `jwt` Kubernetes Secret -- Agentgateway validates via the JWKS endpoint (`/jwks.json`) on the kagent controller -- Standard JWT claims are validated: issuer, audience, expiration, not-before -- The `X-User-ID` header is set automatically on forwarded requests - -### Phase 3: Authorization (AccessPolicy) - -After OBO token validation, agentgateway evaluates `AccessPolicy` resources to determine whether the request should be allowed based on: -- **Subjects** — users and agents making requests -- **Targets** — agents and MCP servers being accessed - -## Supported Identity Providers - -| Provider | Description | -|----------|-------------| -| **Auto** | Default sample IdP for getting started | -| **Generic OIDC** | Any OpenID Connect-compliant provider | -| **Keycloak** | Open-source identity and access management | -| **Microsoft Entra ID** | Azure Active Directory | -| **Okta** | Enterprise identity management | - -## RBAC Roles - -| Role | Permissions | -|------|-------------| -| **Admin** | Full access to all features, user management, and configuration | -| **Writer** | Create, modify, and delete agents, tools, and models | -| **Reader** | View-only access to agents, tools, traces, and dashboards | - -Roles are mapped from IdP groups via the `rbac-config` ConfigMap using CEL expressions. - -## Network Enforcement with Agentgateway - -Because Solo Enterprise for agentgateway proxies traffic to agentic resources, you can set up: - -- **Timeouts** — Request timeouts for agent and tool calls -- **Retries** — Retry policies for resilience -- **mTLS** — Automatic mutual TLS via Istio ambient mesh -- **Policy enforcement** — Agentgateway acts as a waypoint proxy in the ambient mesh - -## Complete Security Flow - -``` -1. User --> IdP --> Login with credentials -2. IdP --> User --> Return user's OIDC token (signed by IdP key) -3. User --> kagent controller --> API request with OIDC token -4. kagent controller --> Validate OIDC token (using IdP public key) -5. kagent controller --> Generate OBO token (signed by kagent RSA key) -6. kagent controller --> agentgateway --> Forward request with OBO token -7. agentgateway --> kagent controller --> Fetch JWKS from /jwks.json -8. kagent controller --> agentgateway --> Return kagent's public key -9. agentgateway --> Verify JWT signature & validate claims -10. agentgateway --> Check AccessPolicy -11. agentgateway --> Agent/MCP Tool --> Forward request (if authorized) -12. Agent/MCP Tool --> agentgateway --> Response -13. agentgateway --> User --> Return response -``` diff --git a/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx b/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx deleted file mode 100644 index 4d4671c..0000000 --- a/src/app/docs/kagent/enterprise/tools-mcp-servers/page.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Tools & MCP Servers" -pageOrder: 8 -description: "Built-in tools, Kubernetes services as MCP, remote MCP servers, and agents as tools." ---- - -export const metadata = { - title: "Tools & MCP Servers", - description: "Built-in tools, Kubernetes services as MCP, remote MCP servers, and agents as tools.", - author: "kagent.dev" -}; - -# Tools & MCP Servers - -Solo Enterprise for kagent provides multiple ways to integrate MCP (Model Context Protocol) tools with your agents. - -## Tool Types - -| Type | Description | -|------|-------------| -| **Built-in tools** | Pre-packaged tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, Argo Rollouts | -| **Kubernetes Services as MCP servers** | Discover HTTP tools from OpenAPI-compliant services | -| **Remote MCP servers** | Connect to external MCP-compatible tool servers | -| **Custom MCP servers** | Build your own MCP tool server from scratch | -| **Agents as tools** | Reference other agents as tools via A2A protocol | - -## Built-in Tools - -Comprehensive built-in tools for: - -- **Pod management and monitoring** — List, describe, get logs, exec into pods -- **Service discovery and configuration** — Query services, endpoints, configs -- **Helm operations** — Install, upgrade, uninstall releases -- **Istio operations** — Proxy status, config, analyze, install -- **Prometheus queries** — Instant and range PromQL queries -- **Grafana management** — Organizations, dashboards, alerts -- **Cilium operations** — Status, install, upgrade, cluster mesh -- **Argo Rollouts** — Verify, promote, pause, set image - -## Managing Tools via the UI - -1. Navigate to **Inventory > Tools** to view all discovered MCP tools -2. Navigate to **Inventory > Tool Servers** to view tool server configurations -3. Click **+ Add New Tool Server** to register a new server - -## Remote MCP Servers - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: RemoteMCPServer -metadata: - name: my-remote-server - namespace: kagent -spec: - protocol: SSE # or STREAMABLE_HTTP - url: http://my-mcp-server:8080/sse - headersFrom: - - secretRef: - name: server-auth-token - key: Authorization -``` - -## Agents as Tools - -Any agent can be used as a tool by other agents: - -```yaml -tools: - - type: Agent - agent: - name: specialist-agent - namespace: default -``` - -## Agentgateway Integration - -Agentgateway is built into the MCP tool servers, providing: - -- Secure communication -- AccessPolicy enforcement -- Timeout and retry policies -- Network-level observability diff --git a/src/app/docs/kagent/resources/agent-crd-reference/page.mdx b/src/app/docs/kagent/resources/agent-crd-reference/page.mdx deleted file mode 100644 index 33dbde2..0000000 --- a/src/app/docs/kagent/resources/agent-crd-reference/page.mdx +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: "Agent CRD Reference" -pageOrder: 2 -description: "Complete reference for the kagent Agent Custom Resource Definition (v1alpha2)." ---- - -export const metadata = { - title: "Agent CRD Reference", - description: "Complete reference for the kagent Agent Custom Resource Definition (v1alpha2).", - author: "kagent.dev" -}; - -# Agent CRD Reference - -Complete reference for the kagent Agent Custom Resource Definition (v1alpha2). - -## Agent Resource - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: - namespace: -spec: - type: Declarative | BYO - declarative: - byo: - skills: - allowedNamespaces: [] -``` - -## DeclarativeAgentSpec - -```yaml -declarative: - runtime: python | go - modelConfig: - systemMessage: - promptTemplate: - dataSources: - - configMapRef: - name: - tools: - - type: McpServer | Agent - mcpServer: - agent: - a2aServer: - enabled: - port: - memory: - enabled: - embeddingProvider: - type: - model: - secretRef: - name: - context: - eventsCompaction: - enabled: - deployment: -``` - -## McpServerTool - -```yaml -mcpServer: - name: - kind: RemoteMCPServer | MCPServer - toolNames: - - - requireApproval: - - - propagateHeaders: - enabled: -``` - -## AgentTool - -```yaml -agent: - name: - namespace: -``` - -## SkillForAgent - -```yaml -skills: - refs: - - image: - gitRefs: - - url: - ref: - path: - name: - gitAuthSecretRef: - name: - insecureSkipVerify: -``` - -## SharedDeploymentSpec - -```yaml -deployment: - replicas: - imageRegistry: - resources: - requests: - cpu: - memory: - limits: - cpu: - memory: - tolerations: [] - affinity: - nodeSelector: - securityContext: - serviceAccountName: - volumes: [] - volumeMounts: [] - imagePullPolicy: - imagePullSecrets: [] -``` - -## ModelConfig Resource - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: ModelConfig -metadata: - name: -spec: - provider: OpenAI | Anthropic | Gemini | GeminiVertexAI | AnthropicVertexAI | AzureOpenAI | Bedrock | Ollama - model: - apiKeySecret: - apiKeySecretKey: - baseURL: - azureEndpoint: - region: -``` - -## RemoteMCPServer Resource - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: RemoteMCPServer -metadata: - name: -spec: - protocol: SSE | STREAMABLE_HTTP - url: - headersFrom: - - secretRef: - name: - key: -status: - discoveredTools: [] -``` - -## MCPServer Resource (kmcp) - -```yaml -apiVersion: kagent.dev/v1alpha1 -kind: MCPServer -metadata: - name: -spec: - deployment: - image: - cmd: - args: [] - port: - secretRefs: - - name: - transportType: stdio -``` - -## ModelProviderConfig Resource - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: ModelProviderConfig -metadata: - name: -spec: - provider: OpenAI | Anthropic | Gemini | ... - apiKeySecretRef: - name: - key: -status: - discoveredModels: [] - ready: -``` diff --git a/src/config/navigation.json b/src/config/navigation.json index 50ef686..b72a0eb 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -289,12 +289,7 @@ "href": "/docs/kagent/resources/helm", "description": "kagent Helm chart configuration reference" }, - { - "title": "Agent CRD Reference", - "href": "/docs/kagent/resources/agent-crd-reference", - "description": "Complete reference for the Agent, ModelConfig, RemoteMCPServer, MCPServer, and ModelProviderConfig CRDs." - }, - { +{ "title": "FAQs", "href": "/docs/kagent/resources/faq", "description": "Find answers to frequently asked questions about kagent." @@ -306,53 +301,6 @@ } ] } - { - "title": "Solo Enterprise", - "href": "/docs/kagent/enterprise", - "description": "Production-ready enterprise distribution with multicluster federation, advanced security, and built-in observability.", - "items": [ - { - "title": "Installation & Operations", - "href": "/docs/kagent/enterprise/installation", - "description": "Install, upgrade, and manage Solo Enterprise for kagent." - }, - { - "title": "Security & Access Control", - "href": "/docs/kagent/enterprise/security", - "description": "OIDC authentication, OBO tokens, AccessPolicy, and agentgateway enforcement." - }, - { - "title": "Multicluster Federation", - "href": "/docs/kagent/enterprise/multicluster", - "description": "Management-agent relay architecture for federated agent management." - }, - { - "title": "Observability", - "href": "/docs/kagent/enterprise/observability", - "description": "Built-in OTel pipeline, distributed tracing, metrics, and ClickHouse storage." - }, - { - "title": "Enterprise UI", - "href": "/docs/kagent/enterprise/enterprise-ui", - "description": "Interactive dashboard for agents, tools, models, tracing, and cluster management." - }, - { - "title": "Agent Frameworks (BYO)", - "href": "/docs/kagent/enterprise/agent-frameworks", - "description": "Bring your own agents with Google ADK, CrewAI, or LangGraph." - }, - { - "title": "Model Providers", - "href": "/docs/kagent/enterprise/model-providers", - "description": "Configure LLM providers across clusters." - }, - { - "title": "Tools & MCP Servers", - "href": "/docs/kagent/enterprise/tools-mcp-servers", - "description": "Built-in tools, remote MCP servers, and agents as tools." - } - ] - } ] }, { From 1a88f1a0ef482e580e7e17fa42bf34c0e004e6e2 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:01:35 -0400 Subject: [PATCH 03/27] =?UTF-8?q?first=20pass=20at=20updating=20blocking?= =?UTF-8?q?=20issues=20as=20follows:=20Blocking=20issues=20(9):=20=20=201.?= =?UTF-8?q?=20All=20tool=20names=20wrong=20=E2=80=94=20kubectl=5F*=20prefi?= =?UTF-8?q?x=20should=20be=20k8s=5F*,=20many=20tools=20fabricated=20or=20m?= =?UTF-8?q?isnamed=20=20=202.=20Memory=20config=20YAML=20wrong=20=E2=80=94?= =?UTF-8?q?=20uses=20nonexistent=20enabled/embeddingProvider=20fields;=20s?= =?UTF-8?q?hould=20be=20modelConfig/ttlDays=20=20=203.=20Context=20managem?= =?UTF-8?q?ent=20YAML=20wrong=20=E2=80=94=20eventsCompaction.enabled=20sho?= =?UTF-8?q?uld=20be=20compaction=20with=20compactionInterval/etc.=20=20=20?= =?UTF-8?q?4.=20Prompt=20template=20dataSources=20wrong=20=E2=80=94=20conf?= =?UTF-8?q?igMapRef.name=20should=20be=20flat=20kind/name/alias=20fields?= =?UTF-8?q?=20=20=205.=20BYO=20agent=20YAML=20nesting=20wrong=20=E2=80=94?= =?UTF-8?q?=20image/replicas=20should=20be=20under=20byo.deployment,=20not?= =?UTF-8?q?=20at=20byo=20level=20=20=206.=20Memory=20API=20endpoints=20wro?= =?UTF-8?q?ng=20=E2=80=94=20uses=20path=20params=20but=20actual=20API=20us?= =?UTF-8?q?es=20query=20params,=20plus=20missing=20endpoints=20=20=207.=20?= =?UTF-8?q?OCI=20skills=20refs=20format=20wrong=20=E2=80=94=20refs=20is=20?= =?UTF-8?q?a=20string=20array,=20not=20objects=20with=20image=20key=20=20?= =?UTF-8?q?=208.=20Read-only=20mode=20(kagentTools.readOnly)=20=E2=80=94?= =?UTF-8?q?=20no=20evidence=20this=20exists=20=20=209.=20navigation.json?= =?UTF-8?q?=20indentation=20bug=20=E2=80=94=20line=20292=20lost=20leading?= =?UTF-8?q?=20whitespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../kagent/concepts/agent-memory/page.mdx | 25 ++- .../concepts/context-management/page.mdx | 14 +- .../kagent/concepts/git-based-skills/page.mdx | 2 +- .../concepts/human-in-the-loop/page.mdx | 1 + .../kagent/concepts/multi-runtime/page.mdx | 2 +- .../kagent/concepts/prompt-templates/page.mdx | 19 +- .../kagent/concepts/tools-ecosystem/page.mdx | 177 ++++++++++-------- src/config/navigation.json | 2 +- 8 files changed, 138 insertions(+), 104 deletions(-) diff --git a/src/app/docs/kagent/concepts/agent-memory/page.mdx b/src/app/docs/kagent/concepts/agent-memory/page.mdx index bd4f059..4364d03 100644 --- a/src/app/docs/kagent/concepts/agent-memory/page.mdx +++ b/src/app/docs/kagent/concepts/agent-memory/page.mdx @@ -33,6 +33,8 @@ Memory in kagent is: ### Enable Memory on an Agent +Memory is enabled by setting the `memory` field on the declarative agent spec. The `modelConfig` field references a `ModelConfig` object whose embedding provider will be used to generate memory vectors. + ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent @@ -44,22 +46,15 @@ spec: modelConfig: default-model-config systemMessage: "You are a helpful assistant with long-term memory." memory: - enabled: true - embeddingProvider: - type: OpenAI - model: text-embedding-3-small + modelConfig: default-model-config ``` -### Memory with Separate Embedding Provider +### Custom TTL ```yaml memory: - enabled: true - embeddingProvider: - type: OpenAI - model: text-embedding-3-small - secretRef: - name: openai-embedding-key + modelConfig: default-model-config + ttlDays: 30 ``` ## How Memory Works @@ -91,9 +86,11 @@ When memory is enabled, three tools are injected into the agent: ## Memory Management via API ``` -GET /api/memories/{agentId} # List memories -DELETE /api/memories/{agentId} # Clear all memories -DELETE /api/memories/{agentId}/{id} # Delete specific memory +POST /api/memories/sessions # Add a memory +POST /api/memories/sessions/batch # Add memories in batch +POST /api/memories/search # Search memories by cosine similarity +GET /api/memories?agent_name=X&user_id=Y # List memories +DELETE /api/memories?agent_name=X&user_id=Y # Clear all memories ``` ## Technical Details diff --git a/src/app/docs/kagent/concepts/context-management/page.mdx b/src/app/docs/kagent/concepts/context-management/page.mdx index c58ddb6..476b8e6 100644 --- a/src/app/docs/kagent/concepts/context-management/page.mdx +++ b/src/app/docs/kagent/concepts/context-management/page.mdx @@ -16,6 +16,8 @@ Long conversations can exceed LLM context windows. kagent provides **event compa ## Configuration +Compaction is enabled by setting the `context.compaction` field on the declarative agent spec: + ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent @@ -27,10 +29,18 @@ spec: modelConfig: default-model-config systemMessage: "You are a helpful agent for extended sessions." context: - eventsCompaction: - enabled: true + compaction: + compactionInterval: 5 ``` +### Configuration Options + +| Field | Default | Description | +|-------|---------|-------------| +| `compactionInterval` | `5` | Number of new user invocations before triggering a compaction | +| `overlapSize` | `2` | Number of preceding invocations to include for context overlap | +| `eventRetentionSize` | — | Number of most recent events to always retain | + ## How It Works 1. As the conversation progresses, events accumulate in the session history diff --git a/src/app/docs/kagent/concepts/git-based-skills/page.mdx b/src/app/docs/kagent/concepts/git-based-skills/page.mdx index 4e04a64..cb146d5 100644 --- a/src/app/docs/kagent/concepts/git-based-skills/page.mdx +++ b/src/app/docs/kagent/concepts/git-based-skills/page.mdx @@ -76,7 +76,7 @@ Combine Git and OCI skills: ```yaml skills: refs: - - image: ghcr.io/myorg/k8s-skills:latest + - ghcr.io/myorg/k8s-skills:latest gitRefs: - url: https://github.com/myorg/skills-repo.git ref: main diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx index 6d14344..4d54377 100644 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -48,6 +48,7 @@ spec: tools: - type: McpServer mcpServer: + apiGroup: kagent.dev name: kagent-tool-server kind: RemoteMCPServer toolNames: diff --git a/src/app/docs/kagent/concepts/multi-runtime/page.mdx b/src/app/docs/kagent/concepts/multi-runtime/page.mdx index 0fe4481..ee3f22d 100644 --- a/src/app/docs/kagent/concepts/multi-runtime/page.mdx +++ b/src/app/docs/kagent/concepts/multi-runtime/page.mdx @@ -92,8 +92,8 @@ metadata: spec: type: BYO byo: - image: myregistry/my-custom-agent:v1.0 deployment: + image: myregistry/my-custom-agent:v1.0 replicas: 1 resources: requests: diff --git a/src/app/docs/kagent/concepts/prompt-templates/page.mdx b/src/app/docs/kagent/concepts/prompt-templates/page.mdx index af3a5ab..1e3e8b9 100644 --- a/src/app/docs/kagent/concepts/prompt-templates/page.mdx +++ b/src/app/docs/kagent/concepts/prompt-templates/page.mdx @@ -37,6 +37,8 @@ kagent ships a `kagent-builtin-prompts` ConfigMap with five reusable templates: ## Usage +Each data source in `promptTemplate.dataSources` references a ConfigMap by `name` and `kind`, with an optional `alias` for shorter include directives: + ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent @@ -48,21 +50,24 @@ spec: modelConfig: default-model-config promptTemplate: dataSources: - - configMapRef: - name: kagent-builtin-prompts - - configMapRef: - name: my-custom-prompts + - kind: ConfigMap + name: kagent-builtin-prompts + alias: builtin + - kind: ConfigMap + name: my-custom-prompts systemMessage: | You are a Kubernetes management agent named {{.AgentName}}. - {{include "kagent-builtin-prompts/safety-guardrails"}} - {{include "kagent-builtin-prompts/tool-usage-best-practices"}} + {{include "builtin/safety-guardrails"}} + {{include "builtin/tool-usage-best-practices"}} {{include "my-custom-prompts/k8s-specific-rules"}} Your tools: {{.ToolNames}} Your skills: {{.SkillNames}} ``` +When an `alias` is set, use `include("alias/key")`. Otherwise, use `include("name/key")`. + ### Available Template Variables | Variable | Description | @@ -94,7 +99,7 @@ data: ## How It Works 1. The controller watches ConfigMaps referenced in `promptTemplate.dataSources` -2. During reconciliation, `{{include "configmap-name/key"}}` directives are resolved +2. During reconciliation, `{{include "alias/key"}}` directives are resolved 3. Template variables are interpolated 4. The fully expanded system message is written to the ADK config 5. ConfigMap changes trigger automatic re-reconciliation diff --git a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx index 133b562..257aa92 100644 --- a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx +++ b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx @@ -12,9 +12,9 @@ export const metadata = { # Tools Ecosystem -kagent provides a rich set of built-in tools through MCP (Model Context Protocol) servers, plus the ability to add custom tools. All tools are integrated via the kagent-tools package. +kagent provides a rich set of built-in tools through MCP (Model Context Protocol) servers, plus the ability to add custom tools. Tools are served by two primary MCP servers: `kagent-tool-server` (Kubernetes, Helm, Istio, Cilium, Argo) and the `kagent-grafana-mcp` server (Grafana, Prometheus, Loki, Incidents). -## Built-in Tool Categories +## kagent-tool-server Tools ### Kubernetes @@ -22,25 +22,32 @@ Comprehensive cluster management tools: | Tool | Description | |------|-------------| -| `kubectl_get` | Query resources (pods, deployments, services, etc.) | -| `kubectl_describe` | Detailed resource information | -| `kubectl_scale` | Scale deployments and statefulsets | -| `kubectl_patch` | Patch resources with strategic merge | -| `kubectl_label` | Add/remove labels | -| `kubectl_annotate` | Add/remove annotations | -| `kubectl_delete` | Delete resources | -| `kubectl_apply` | Apply YAML manifests | -| `kubectl_exec` | Execute commands in pods | -| `kubectl_logs` | Retrieve pod logs | -| `kubectl_events` | Get cluster events | -| `kubectl_connectivity_test` | Test service connectivity | +| `k8s_get_resources` | Query resources (pods, deployments, services, etc.) | +| `k8s_describe_resource` | Detailed resource information | +| `k8s_get_resource_yaml` | Get YAML representation of a resource | +| `k8s_get_pod_logs` | Retrieve pod logs | +| `k8s_get_events` | Get cluster events | +| `k8s_get_available_api_resources` | List supported API resources | +| `k8s_get_cluster_configuration` | Retrieve cluster configuration | +| `k8s_check_service_connectivity` | Test service connectivity | +| `k8s_execute_command` | Execute commands in pods | +| `k8s_patch_resource` | Patch resources with strategic merge | +| `k8s_label_resource` | Add labels to resources | +| `k8s_remove_label` | Remove labels from resources | +| `k8s_annotate_resource` | Add annotations to resources | +| `k8s_remove_annotation` | Remove annotations from resources | +| `k8s_delete_resource` | Delete resources | +| `k8s_apply_manifest` | Apply YAML manifests | +| `k8s_create_resource` | Create a resource from a local file | +| `k8s_create_resource_from_url` | Create a resource from a URL | +| `k8s_generate_resource` | Generate YAML for Istio, Gateway API, or Argo resources | ### Helm | Tool | Description | |------|-------------| -| `helm_list` | List installed releases | -| `helm_install` | Install a chart | +| `helm_list_releases` | List installed releases | +| `helm_get_release` | Get details of a specific release | | `helm_upgrade` | Upgrade a release | | `helm_uninstall` | Remove a release | | `helm_repo_add` | Add chart repository | @@ -52,60 +59,91 @@ Comprehensive cluster management tools: |------|-------------| | `istio_proxy_status` | Check proxy synchronization status | | `istio_proxy_config` | Inspect proxy configuration | -| `istio_install` | Install Istio | -| `istio_manifest_generate` | Generate installation manifests | -| `istio_analyze` | Analyze Istio configuration for issues | +| `istio_install_istio` | Install Istio | +| `istio_generate_manifest` | Generate installation manifests | +| `istio_analyze_cluster_configuration` | Analyze Istio configuration for issues | | `istio_version` | Get Istio version info | | `istio_remote_clusters` | Manage remote cluster configuration | -| `istio_waypoint` | Manage waypoint proxies | +| `istio_waypoint_status` | Get waypoint proxy status | +| `istio_list_waypoints` | List waypoint proxies | +| `istio_generate_waypoint` | Generate waypoint configuration | +| `istio_apply_waypoint` | Apply waypoint configuration | +| `istio_delete_waypoint` | Delete a waypoint proxy | +| `istio_ztunnel_config` | Inspect ztunnel configuration | ### Argo Rollouts | Tool | Description | |------|-------------| -| `argo_rollouts_verify` | Verify controller is running | -| `argo_rollouts_check_plugins` | Check installed plugins | -| `argo_rollouts_promote` | Promote a rollout | -| `argo_rollouts_pause` | Pause a rollout | -| `argo_rollouts_set_image` | Update rollout image | +| `argo_verify_argo_rollouts_controller_install` | Verify the Argo Rollouts controller is running | ### Cilium +Selected tools (Cilium has 30+ tools available): + | Tool | Description | |------|-------------| -| `cilium_status` | Check Cilium status | -| `cilium_install` | Install Cilium | -| `cilium_upgrade` | Upgrade Cilium | -| `cilium_clustermesh` | Manage cluster mesh | -| `cilium_bgp_peers` | View BGP peers | -| `cilium_bgp_routes` | View BGP routes | +| `cilium_status_and_version` | Check Cilium status and version | +| `cilium_install_cilium` | Install Cilium | +| `cilium_upgrade_cilium` | Upgrade Cilium | +| `cilium_toggle_cluster_mesh` | Enable/disable cluster mesh | +| `cilium_show_cluster_mesh_status` | View cluster mesh status | +| `cilium_list_bgp_peers` | View BGP peers | +| `cilium_list_bgp_routes` | View BGP routes | +| `cilium_get_endpoints_list` | List endpoints | +| `cilium_get_endpoint_details` | Get endpoint details | +| `cilium_validate_cilium_network_policies` | Validate network policies | +| `cilium_toggle_hubble` | Enable/disable Hubble observability | + +## kagent-grafana-mcp Tools + +Prometheus, Grafana, Loki, and incident management tools are served by a separate `kagent-grafana-mcp` MCP server (`RemoteMCPServer`): ### Prometheus | Tool | Description | |------|-------------| -| `prometheus_query` | Execute instant PromQL queries | -| `prometheus_query_range` | Execute range PromQL queries | -| `prometheus_labels` | Discover available labels | -| `prometheus_targets` | List scrape targets and status | +| `query_prometheus` | Execute PromQL queries | +| `list_prometheus_metric_names` | List available metric names | +| `list_prometheus_metric_metadata` | Get metric metadata | +| `list_prometheus_label_names` | List available label names | +| `list_prometheus_label_values` | List values for a specific label | ### Grafana | Tool | Description | |------|-------------| -| `grafana_orgs` | Manage organizations | -| `grafana_dashboards` | List/manage dashboards | -| `grafana_alerts` | View/manage alerts | -| `grafana_datasources` | Manage data sources | +| `search_dashboards` | Search dashboards | +| `update_dashboard` | Update a dashboard | +| `get_dashboard_by_uid` | Get a dashboard by UID | +| `get_dashboard_panel_queries` | Get panel queries from a dashboard | +| `list_datasources` | List data sources | +| `get_datasource_by_name` | Get a data source by name | +| `get_datasource_by_uid` | Get a data source by UID | +| `list_alert_rules` | List alert rules | +| `get_alert_rule_by_uid` | Get a specific alert rule | +| `list_contact_points` | List notification contact points | + +### Loki + +| Tool | Description | +|------|-------------| +| `query_loki_logs` | Query logs via Loki | +| `query_loki_stats` | Query Loki statistics | +| `list_loki_label_names` | List Loki label names | +| `list_loki_label_values` | List Loki label values | -### Utilities +### Incidents & On-Call | Tool | Description | |------|-------------| -| `datetime_format` | Format timestamps | -| `datetime_parse` | Parse date strings | -| `shell_execute` | Run shell commands | -| `docs_query` | Query product documentation | +| `list_incidents` | List incidents | +| `get_incident` | Get incident details | +| `create_incident` | Create a new incident | +| `add_activity_to_incident` | Add activity to an incident | +| `list_oncall_users` | List on-call users | +| `get_current_oncall_users` | Get current on-call users | +| `list_oncall_schedules` | List on-call schedules | ## Agent Built-in Tools @@ -114,11 +152,11 @@ These tools are automatically available to every agent (no configuration needed) | Tool | Description | |------|-------------| | `ask_user` | Pose questions to users with optional choices | -| `SkillsTool` | Discover and load skills | -| `BashTool` | Execute shell commands (Go ADK) | -| `ReadFile` | Read files with pagination (Go ADK) | -| `WriteFile` | Write file content (Go ADK) | -| `EditFile` | Edit files via string replacement (Go ADK) | +| `SkillsTool` | Discover and load skills (Go ADK) | +| `bash` | Execute shell commands (Python ADK) | +| `read_file` | Read file contents with pagination (Python ADK) | +| `write_file` | Write file content (Python ADK) | +| `edit_file` | Edit files via string replacement (Python ADK) | ## Configuring Tools on an Agent @@ -137,13 +175,14 @@ spec: tools: - type: McpServer mcpServer: + apiGroup: kagent.dev name: kagent-tool-server kind: RemoteMCPServer toolNames: - - kubectl_get - - kubectl_describe - - kubectl_logs - - kubectl_events + - k8s_get_resources + - k8s_describe_resource + - k8s_get_pod_logs + - k8s_get_events ``` ### With Tool Approval @@ -152,16 +191,17 @@ spec: tools: - type: McpServer mcpServer: + apiGroup: kagent.dev name: kagent-tool-server kind: RemoteMCPServer toolNames: - - kubectl_get - - kubectl_describe - - kubectl_delete - - kubectl_apply + - k8s_get_resources + - k8s_describe_resource + - k8s_delete_resource + - k8s_apply_manifest requireApproval: - - kubectl_delete - - kubectl_apply + - k8s_delete_resource + - k8s_apply_manifest ``` ### Agent as Tool (A2A) @@ -173,7 +213,6 @@ tools: - type: Agent agent: name: specialist-agent - namespace: default ``` ## Community / Contrib MCP Servers @@ -184,21 +223,3 @@ Additional MCP servers available in `contrib/tools/`: |--------|-------------| | **GitHub MCP Server** | GitHub Copilot MCP server with tools for issues, PRs, repos, actions, and more | | **k8sgpt MCP Server** | K8sGPT integration for AI-powered Kubernetes diagnostics | -| **Grafana MCP** | Extended Grafana integration | - -## Read-Only Mode - -kagent-tools supports a read-only mode for safer operation: - -```yaml -# In Helm values -kagentTools: - readOnly: true # Disables all write/mutating operations -``` - -## Observability - -kagent-tools exposes Prometheus metrics for monitoring: -- Tool invocation counts -- Tool execution duration -- Error rates by tool diff --git a/src/config/navigation.json b/src/config/navigation.json index b72a0eb..cdb85dc 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -289,7 +289,7 @@ "href": "/docs/kagent/resources/helm", "description": "kagent Helm chart configuration reference" }, -{ + { "title": "FAQs", "href": "/docs/kagent/resources/faq", "description": "Find answers to frequently asked questions about kagent." From a6840b23ba4426b341cef41ca1be90abd51131a2 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:09:02 -0400 Subject: [PATCH 04/27] memory topic updates based on demo Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../kagent/concepts/agent-memory/page.mdx | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/app/docs/kagent/concepts/agent-memory/page.mdx b/src/app/docs/kagent/concepts/agent-memory/page.mdx index 4364d03..89a953c 100644 --- a/src/app/docs/kagent/concepts/agent-memory/page.mdx +++ b/src/app/docs/kagent/concepts/agent-memory/page.mdx @@ -12,22 +12,16 @@ export const metadata = { # Agent Memory -kagent provides long-term memory for agents using vector similarity search. Agents can automatically save and retrieve relevant context across conversations. +kagent provides long-term memory for agents using vector similarity search. Built on top of the Google ADK memory implementation, agents can automatically save and retrieve relevant context across conversations. ## Overview Memory in kagent is: -- **Vector-backed** — Uses embedding models to encode memories as 768-dimensional vectors +- **Vector-backed** — A basic vector store that uses embedding models to encode memories as 768-dimensional vectors - **Searchable** — Retrieves relevant memories via cosine similarity -- **Automatic** — Extracts and saves memories periodically without explicit user action +- **Automatic** — Extracts and saves user intent, key learnings, and preferences without explicit user action - **Time-bounded** — Memories expire after a configurable TTL (default 15 days) - -## Supported Storage Backends - -| Backend | Description | -|---------|-------------| -| **pgvector** (PostgreSQL) | Full-featured vector search using the pgvector extension | -| **Turso/libSQL** (SQLite) | Lightweight alternative using SQLite-compatible storage | +- **Shared storage** — Memory uses the same kagent database (PostgreSQL or SQLite/Turso), not a separate database ## Configuration @@ -35,6 +29,8 @@ Memory in kagent is: Memory is enabled by setting the `memory` field on the declarative agent spec. The `modelConfig` field references a `ModelConfig` object whose embedding provider will be used to generate memory vectors. +In the kagent UI, you can configure memory when creating or editing an agent by selecting an embedding model and setting the memory TTL. + ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent @@ -62,7 +58,7 @@ memory: ### Automatic Save Cycle 1. The agent processes user messages normally -2. Every 5th user message, the agent automatically extracts key information +2. Every 5th user message, the agent automatically extracts key information such as user intent, key learnings, and preferences 3. Extracted memories are summarized and encoded as embedding vectors 4. Vectors are stored in the database with metadata and timestamps @@ -83,6 +79,12 @@ When memory is enabled, three tools are injected into the agent: | `load_memory` | Search for relevant memories by query | | `prefetch_memory` | Automatically run before response generation | +You can also instruct the agent to use `save_memory` or `load_memory` explicitly during a conversation. + +### Viewing Memories + +In the kagent UI, you can view the memories an agent has saved. This lets you inspect what the agent has learned and retained from past interactions. + ## Memory Management via API ``` @@ -90,12 +92,17 @@ POST /api/memories/sessions # Add a memory POST /api/memories/sessions/batch # Add memories in batch POST /api/memories/search # Search memories by cosine similarity GET /api/memories?agent_name=X&user_id=Y # List memories -DELETE /api/memories?agent_name=X&user_id=Y # Clear all memories +DELETE /api/memories?agent_name=X&user_id=Y # Clear all memories for an agent ``` +## Limitations + +- **No per-memory deletion** — You can clear all memories for an agent, but cannot delete individual memory entries +- **No cross-agent memory sharing** — Each agent has its own isolated memory store; memories cannot be shared across agents +- **Not pluggable** — Memory is built on the Google ADK memory implementation and cannot be swapped for an alternative memory solution (such as Cognee). However, if an alternative memory solution exposes an MCP server, you can add it as a tool and instruct the agent to use it instead of the built-in memory + ## Technical Details - Embedding vectors are normalized to 768 dimensions - Background TTL pruning runs periodically (default retention: 15 days) -- Memory is per-agent — each agent has its own isolated memory store - Memories include timestamps and source session references From ef60ae88d2bbd212da0a2923a73054310d71a6e5 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:10:06 -0400 Subject: [PATCH 05/27] HITL topic updates based on demo Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../kagent/concepts/human-in-the-loop/page.mdx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx index 4d54377..1c98968 100644 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -33,7 +33,7 @@ This is useful for destructive or sensitive operations like: ### Configuration -Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`: +Tool approval is configured in the Agent CR (not in the UI). Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`: ```yaml apiVersion: kagent.dev/v1alpha2 @@ -52,15 +52,16 @@ spec: name: kagent-tool-server kind: RemoteMCPServer toolNames: - - read_file - - write_file - - delete_file + - k8s_get_resources + - k8s_describe_resource + - k8s_delete_resource + - k8s_apply_manifest requireApproval: - - delete_file - - write_file + - k8s_delete_resource + - k8s_apply_manifest ``` -In this example, `read_file` executes immediately, but `write_file` and `delete_file` will pause for user approval. +In this example, `k8s_get_resources` and `k8s_describe_resource` execute immediately, but `k8s_delete_resource` and `k8s_apply_manifest` will pause for user approval. ### How It Works @@ -91,6 +92,8 @@ When rejecting a tool call, users can provide a free-text explanation. This reas The `ask_user` tool is a built-in tool automatically added to every agent. It allows agents to pose questions to users with optional predefined choices during execution. +For example, an agent might ask "Which types of Kubernetes resources should I check?" and present options like Pods, Deployments, and Services as selectable choices. + Use cases: - Clarifying ambiguous user requests - Offering choices between implementation approaches From d2872e60fa899663fef97118f8215c6d0ed9fd69 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:12:41 -0400 Subject: [PATCH 06/27] add v0.8 release notes Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../kagent/resources/release-notes/page.mdx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 85a7086..0350032 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -18,6 +18,108 @@ The kagent documentation shows information only for the latest release. If you r For more details on the changes between versions, review the [kagent GitHub releases](https://github.com/kagent-dev/kagent/releases). +# v0.8 + +Review the main changes from kagent version 0.7 to v0.8, then continue reading for more detailed information. + +* Human-in-the-Loop (HITL) — tool approval gates and interactive `ask_user` tool +* Agent Memory — vector-backed long-term memory for agents +* Go ADK runtime — new Go-based agent runtime for faster startup and lower resource usage +* Agents as MCP servers — expose A2A agents via MCP for cross-tool interoperability +* Skills — markdown knowledge documents loaded from OCI images or Git repositories +* Go workspace restructure — the Go codebase is split into `api`, `core`, and `adk` modules for composability +* Prompt templates — reusable prompt fragments from ConfigMaps using Go template syntax +* Context management — automatic event compaction for long conversations +* AWS Bedrock support — new model provider for AWS Bedrock + +## Human-in-the-Loop (HITL) + +kagent now supports two Human-in-the-Loop mechanisms that pause agent execution and wait for user input: + +**Tool Approval** — Mark specific tools as requiring user confirmation before execution using the `requireApproval` field in the Agent CR. When the agent tries to call an approval-required tool, the UI presents Approve/Reject buttons. Rejected tool calls include the rejection reason as context for the LLM. + +**Ask User** — A built-in `ask_user` tool is automatically added to every agent. Agents can pose questions to users with predefined choices (single-select, multi-select) or free-text input during execution. + +For more information, see the [Human-in-the-Loop](/docs/kagent/concepts/human-in-the-loop) concept guide. + +## Agent Memory + +Agents can now automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on the Google ADK memory implementation and uses the same kagent database (PostgreSQL or SQLite/Turso). + +When memory is enabled on an agent, three tools are injected: `save_memory`, `load_memory`, and `prefetch_memory`. The agent automatically extracts key information (user intent, key learnings, preferences) every 5th user message. + +Configure memory in the Agent CR or through the UI when creating/editing an agent by selecting an embedding model and TTL. + +For more information, see the [Agent Memory](/docs/kagent/concepts/agent-memory) concept guide. + +## Go ADK Runtime + +kagent now supports two Agent Development Kit runtimes: **Python** (default) and **Go**. The Go ADK provides significantly faster startup (~2 seconds vs ~15 seconds for Python) and lower resource consumption. + +Select the runtime via the `runtime` field in the declarative agent spec: + +```yaml +spec: + type: Declarative + declarative: + runtime: go +``` + +The Go ADK includes built-in tools: `SkillsTool`, `BashTool`, `ReadFile`, `WriteFile`, and `EditFile`. + +For more information, see the [Multi-Runtime Support](/docs/kagent/concepts/multi-runtime) concept guide. + +## Agents as MCP Servers + +A2A agents are now exposed as MCP servers via the kagent controller HTTP server. This enables cross-tool interoperability — agents can be consumed by any MCP-compatible client, not just through the A2A protocol. + +## Skills + +Agents can now load markdown-based knowledge documents (skills) that provide domain-specific instructions, best practices, and procedures. Skills are loaded at agent startup and discoverable through the built-in `SkillsTool`. + +kagent supports two skill sources: +- **OCI images** — Container images containing skill files +- **Git repositories** — Clone skills directly from Git repos, with support for private repos via HTTPS token or SSH key authentication + +For more information, see the [Git-Based Skills](/docs/kagent/concepts/git-based-skills) concept guide. + +## Go Workspace Restructure + +The Go code is restructured into a Go workspace with three modules: `api`, `core`, and `adk`. This makes the codebase more composable for users who want to pull in parts of kagent (such as the API types or ADK) without importing all dependencies. + +| Module | Purpose | +|--------|---------| +| `go/api` | Shared types: CRDs, ADK config types, database models, HTTP client | +| `go/core` | Infrastructure: controllers, HTTP server, CLI | +| `go/adk` | Go Agent Development Kit runtime | + +## Prompt Templates + +Agent system messages now support Go `text/template` syntax. Store common prompt fragments (safety guardrails, tool usage best practices) in ConfigMaps and reference them with `{{include "alias/key"}}` syntax. + +kagent ships a `kagent-builtin-prompts` ConfigMap with five reusable templates: `skills-usage`, `tool-usage-best-practices`, `safety-guardrails`, `kubernetes-context`, and `a2a-communication`. + +For more information, see the [Prompt Templates](/docs/kagent/concepts/prompt-templates) concept guide. + +## Context Management + +Long conversations can now be automatically compacted to stay within LLM context windows. Configure the `context.compaction` field to enable periodic summarization of older events while preserving key information. + +For more information, see the [Context Management](/docs/kagent/concepts/context-management) concept guide. + +## AWS Bedrock Support + +A new model provider for AWS Bedrock has been added, allowing agents to use Bedrock-hosted models. + +## Additional Changes + +- **API key passthrough** for ModelConfig +- **Custom service account** override in agent CRDs +- **Voice support** for agents +- **UI dynamic provider model discovery** for easier model configuration +- **CLI `--token` flag** for `kagent invoke` API key passthrough +- **CVE fixes** across Go, Python, and container images + # v0.7 Review the main changes from kagent version 0.6 to v0.7, then continue reading for more detailed information. From 9ea802fdad6b732a30507e829bceb56dd8da06c0 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:19:16 -0400 Subject: [PATCH 07/27] apply style guide: second-person voice, active voice, periods on list items, namespace in YAML Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../kagent/concepts/agent-memory/page.mdx | 67 ++++--- .../concepts/context-management/page.mdx | 40 ++-- .../kagent/concepts/git-based-skills/page.mdx | 35 ++-- .../concepts/human-in-the-loop/page.mdx | 70 ++++--- .../kagent/concepts/multi-runtime/page.mdx | 33 +-- .../kagent/concepts/prompt-templates/page.mdx | 57 +++--- .../kagent/concepts/tools-ecosystem/page.mdx | 189 +++++++++--------- .../kagent/resources/release-notes/page.mdx | 71 +++---- 8 files changed, 296 insertions(+), 266 deletions(-) diff --git a/src/app/docs/kagent/concepts/agent-memory/page.mdx b/src/app/docs/kagent/concepts/agent-memory/page.mdx index 89a953c..8fe3922 100644 --- a/src/app/docs/kagent/concepts/agent-memory/page.mdx +++ b/src/app/docs/kagent/concepts/agent-memory/page.mdx @@ -12,81 +12,88 @@ export const metadata = { # Agent Memory -kagent provides long-term memory for agents using vector similarity search. Built on top of the Google ADK memory implementation, agents can automatically save and retrieve relevant context across conversations. +With agent memory, your agents can automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on top of the Google ADK memory implementation. ## Overview -Memory in kagent is: -- **Vector-backed** — A basic vector store that uses embedding models to encode memories as 768-dimensional vectors -- **Searchable** — Retrieves relevant memories via cosine similarity -- **Automatic** — Extracts and saves user intent, key learnings, and preferences without explicit user action -- **Time-bounded** — Memories expire after a configurable TTL (default 15 days) -- **Shared storage** — Memory uses the same kagent database (PostgreSQL or SQLite/Turso), not a separate database +Agent memory provides the following capabilities. + +- **Vector-backed.** A basic vector store uses embedding models to encode memories as 768-dimensional vectors. +- **Searchable.** Agents retrieve relevant memories via cosine similarity. +- **Automatic.** Agents extract and save user intent, key learnings, and preferences without explicit user action. +- **Time-bounded.** Memories expire after a configurable TTL (default 15 days). +- **Shared storage.** Memory uses the same kagent database (PostgreSQL or SQLite/Turso), not a separate database. ## Configuration ### Enable Memory on an Agent -Memory is enabled by setting the `memory` field on the declarative agent spec. The `modelConfig` field references a `ModelConfig` object whose embedding provider will be used to generate memory vectors. +To enable memory, set the `memory` field on the declarative agent spec. The `modelConfig` field references a `ModelConfig` object whose embedding provider generates memory vectors. -In the kagent UI, you can configure memory when creating or editing an agent by selecting an embedding model and setting the memory TTL. +You can also configure memory in the kagent UI when you create or edit an agent by selecting an embedding model and setting the memory TTL. ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: memory-agent + namespace: kagent spec: type: Declarative declarative: modelConfig: default-model-config systemMessage: "You are a helpful assistant with long-term memory." memory: - modelConfig: default-model-config + modelConfig: default-model-config # References the embedding provider ``` ### Custom TTL +To change the default memory retention period, set the `ttlDays` field. + ```yaml memory: modelConfig: default-model-config - ttlDays: 30 + ttlDays: 30 # Memories expire after 30 days instead of the default 15 ``` ## How Memory Works ### Automatic Save Cycle -1. The agent processes user messages normally -2. Every 5th user message, the agent automatically extracts key information such as user intent, key learnings, and preferences -3. Extracted memories are summarized and encoded as embedding vectors -4. Vectors are stored in the database with metadata and timestamps +1. The agent processes user messages normally. +2. Every 5th user message, the agent automatically extracts key information such as user intent, key learnings, and preferences. +3. The agent summarizes extracted memories and encodes them as embedding vectors. +4. The agent stores the vectors in the database with metadata and timestamps. ### Memory Retrieval (Prefetch) -Before generating a response, the agent: -1. Encodes the current user message as an embedding vector -2. Searches stored memories by cosine similarity -3. Injects the most relevant memories into the agent's context +Before generating a response, the agent performs the following steps. + +1. Encodes the current user message as an embedding vector. +2. Searches stored memories by cosine similarity. +3. Injects the most relevant memories into the agent's context. ### Memory Tools -When memory is enabled, three tools are injected into the agent: +When you enable memory, the agent receives three additional tools. | Tool | Description | |------|-------------| -| `save_memory` | Explicitly save a piece of information | -| `load_memory` | Search for relevant memories by query | -| `prefetch_memory` | Automatically run before response generation | +| `save_memory` | Explicitly save a piece of information. | +| `load_memory` | Search for relevant memories by query. | +| `prefetch_memory` | Automatically run before response generation. | You can also instruct the agent to use `save_memory` or `load_memory` explicitly during a conversation. ### Viewing Memories -In the kagent UI, you can view the memories an agent has saved. This lets you inspect what the agent has learned and retained from past interactions. +In the kagent UI, you can view the memories that an agent has saved. This lets you inspect what the agent has learned and retained from past interactions. ## Memory Management via API +The following API endpoints let you manage memories programmatically. + ``` POST /api/memories/sessions # Add a memory POST /api/memories/sessions/batch # Add memories in batch @@ -97,12 +104,12 @@ DELETE /api/memories?agent_name=X&user_id=Y # Clear all memories for an agent ## Limitations -- **No per-memory deletion** — You can clear all memories for an agent, but cannot delete individual memory entries -- **No cross-agent memory sharing** — Each agent has its own isolated memory store; memories cannot be shared across agents -- **Not pluggable** — Memory is built on the Google ADK memory implementation and cannot be swapped for an alternative memory solution (such as Cognee). However, if an alternative memory solution exposes an MCP server, you can add it as a tool and instruct the agent to use it instead of the built-in memory +- **No per-memory deletion.** You can clear all memories for an agent, but you cannot delete individual memory entries. +- **No cross-agent memory sharing.** Each agent has its own isolated memory store. You cannot share memories across agents. +- **Not pluggable.** Memory is built on the Google ADK memory implementation and cannot be swapped for an alternative memory solution (such as Cognee). However, if an alternative memory solution exposes an MCP server, you can add it as a tool and instruct the agent to use it instead of the built-in memory. ## Technical Details -- Embedding vectors are normalized to 768 dimensions -- Background TTL pruning runs periodically (default retention: 15 days) -- Memories include timestamps and source session references +- Embedding vectors are normalized to 768 dimensions. +- Background TTL pruning runs periodically (default retention: 15 days). +- Memories include timestamps and source session references. diff --git a/src/app/docs/kagent/concepts/context-management/page.mdx b/src/app/docs/kagent/concepts/context-management/page.mdx index 476b8e6..6bd3637 100644 --- a/src/app/docs/kagent/concepts/context-management/page.mdx +++ b/src/app/docs/kagent/concepts/context-management/page.mdx @@ -12,17 +12,18 @@ export const metadata = { # Context Management -Long conversations can exceed LLM context windows. kagent provides **event compaction** to automatically summarize older messages, preserving key information while reducing token count. +Long conversations can exceed LLM context windows. With **event compaction**, you can automatically summarize older messages to preserve key information while reducing token count. ## Configuration -Compaction is enabled by setting the `context.compaction` field on the declarative agent spec: +To enable compaction, set the `context.compaction` field on the declarative agent spec. ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: long-conversation-agent + namespace: kagent spec: type: Declarative declarative: @@ -30,37 +31,36 @@ spec: systemMessage: "You are a helpful agent for extended sessions." context: compaction: - compactionInterval: 5 + compactionInterval: 5 # Compact every 5 user invocations ``` ### Configuration Options | Field | Default | Description | |-------|---------|-------------| -| `compactionInterval` | `5` | Number of new user invocations before triggering a compaction | -| `overlapSize` | `2` | Number of preceding invocations to include for context overlap | -| `eventRetentionSize` | — | Number of most recent events to always retain | +| `compactionInterval` | `5` | Number of new user invocations before triggering a compaction. | +| `overlapSize` | `2` | Number of preceding invocations to include for context overlap. | +| `eventRetentionSize` | — | Number of most recent events to always retain. | ## How It Works -1. As the conversation progresses, events accumulate in the session history -2. When the history approaches the model's context limit, compaction triggers -3. Older events are summarized while preserving: - - Key decisions and outcomes - - Important tool results - - Critical context from earlier in the conversation -4. The agent continues with the compacted history seamlessly +1. As the conversation progresses, events accumulate in the session history. +2. When the history approaches the model's context limit, the agent triggers compaction. +3. The agent summarizes older events while preserving key decisions, important tool results, and critical context from earlier in the conversation. +4. The agent continues with the compacted history seamlessly. ## When to Use -Enable event compaction when: -- Agents handle long-running conversations (debugging sessions, investigations) -- Agents call many tools that generate large outputs -- You want to support extended interactions without hitting context limits +Enable event compaction when your agents meet the following criteria. -You may not need it for: -- Short, single-turn interactions -- Agents with small tool sets that generate compact outputs +- Agents handle long-running conversations (debugging sessions, investigations). +- Agents call many tools that generate large outputs. +- You want to support extended interactions without hitting context limits. + +You may not need event compaction for the following scenarios. + +- Short, single-turn interactions. +- Agents with small tool sets that generate compact outputs. ## Context Caching Note diff --git a/src/app/docs/kagent/concepts/git-based-skills/page.mdx b/src/app/docs/kagent/concepts/git-based-skills/page.mdx index cb146d5..9a948aa 100644 --- a/src/app/docs/kagent/concepts/git-based-skills/page.mdx +++ b/src/app/docs/kagent/concepts/git-based-skills/page.mdx @@ -12,15 +12,16 @@ export const metadata = { # Git-Based Skills -Skills are markdown-based knowledge documents that agents load at startup. They provide domain-specific instructions, best practices, and procedures that guide agent behavior. +Skills are markdown-based knowledge documents that agents load at startup. You can use skills to provide domain-specific instructions, best practices, and procedures that guide agent behavior. -kagent supports two sources for skills: -- **OCI images** — Container images containing skill files (original approach) -- **Git repositories** — Clone skills directly from Git repos +You can load skills from two sources. + +- **OCI images.** Container images containing skill files (original approach). +- **Git repositories.** Clone skills directly from Git repos. ## Skill File Format -Each skill is a directory containing a `SKILL.md` file with YAML frontmatter: +Each skill is a directory containing a `SKILL.md` file with YAML frontmatter. ```markdown --- @@ -48,6 +49,7 @@ apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: my-agent + namespace: kagent spec: type: Declarative declarative: @@ -61,17 +63,19 @@ spec: ### With Subdirectory +You can specify a subdirectory within the repository to use as the skill root. + ```yaml skills: gitRefs: - url: https://github.com/myorg/monorepo.git ref: main - path: skills/kubernetes + path: skills/kubernetes # Only use this subdirectory ``` ### Multiple Sources -Combine Git and OCI skills: +You can combine Git and OCI skills in the same agent. ```yaml skills: @@ -94,6 +98,7 @@ apiVersion: v1 kind: Secret metadata: name: git-credentials + namespace: kagent type: Opaque stringData: token: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -123,15 +128,15 @@ skills: ## How It Works -Under the hood, kagent uses a lightweight init container (~30MB) containing Git and krane tools: +Under the hood, a lightweight init container (~30MB) containing Git and krane tools runs before the agent pod starts. -1. Before the agent pod starts, the `skills-init` container runs -2. It clones each Git repository to the skills volume -3. It also pulls any OCI skill images -4. The agent runtime discovers skills from the mounted volume at startup +1. The `skills-init` container clones each Git repository to the skills volume. +2. The container pulls any OCI skill images. +3. The agent runtime discovers skills from the mounted volume at startup. ## Skill Discovery at Runtime -Once loaded, skills are available through the built-in `SkillsTool`: -- **List skills:** The agent calls the tool with no arguments to see available skills -- **Load skill:** The agent calls the tool with a skill name to get the full content +Once loaded, skills are available through the built-in `SkillsTool`. + +- **List skills.** The agent calls the tool with no arguments to see available skills. +- **Load skill.** The agent calls the tool with a skill name to get the full content. diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx index 1c98968..abe012c 100644 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -12,10 +12,10 @@ export const metadata = { # Human-in-the-Loop (HITL) -kagent implements Human-in-the-Loop functionality through two mechanisms: +You can use two Human-in-the-Loop mechanisms to maintain oversight of agent actions. -1. **Tool Approval** — Require user confirmation before executing sensitive tools -2. **Ask User** — Allow agents to interactively ask users questions during execution +1. **Tool Approval.** Require user confirmation before executing sensitive tools. +2. **Ask User.** Allow agents to interactively ask users questions during execution. Both features pause agent execution and wait for user input before continuing. @@ -25,21 +25,23 @@ Both features pause agent execution and wait for user input before continuing. Tool approval lets you mark specific tools as requiring user confirmation before execution. When an agent attempts to call an approval-required tool, execution pauses and the UI presents Approve/Reject buttons. -This is useful for destructive or sensitive operations like: -- Deleting Kubernetes resources -- Writing files -- Executing shell commands -- Modifying infrastructure +Tool approval is useful for destructive or sensitive operations. + +- Deleting Kubernetes resources. +- Writing files. +- Executing shell commands. +- Modifying infrastructure. ### Configuration -Tool approval is configured in the Agent CR (not in the UI). Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`: +You configure tool approval in the Agent CR (not in the UI). Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`. ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: k8s-agent + namespace: kagent spec: type: Declarative declarative: @@ -56,57 +58,58 @@ spec: - k8s_describe_resource - k8s_delete_resource - k8s_apply_manifest - requireApproval: + requireApproval: # These tools pause for user approval - k8s_delete_resource - k8s_apply_manifest ``` -In this example, `k8s_get_resources` and `k8s_describe_resource` execute immediately, but `k8s_delete_resource` and `k8s_apply_manifest` will pause for user approval. +In this example, `k8s_get_resources` and `k8s_describe_resource` execute immediately, but `k8s_delete_resource` and `k8s_apply_manifest` pause for user approval. ### How It Works **Interrupt Phase:** -1. The agent calls a tool marked for approval -2. The ADK generates an `adk_request_confirmation` event -3. The UI receives the event and displays approval controls +1. The agent calls a tool marked for approval. +2. The ADK generates an `adk_request_confirmation` event. +3. The UI receives the event and displays approval controls. **Decision Phase:** -4. The user clicks **Approve** or **Reject** in the UI -5. Optionally, the user provides a rejection reason +4. The user clicks **Approve** or **Reject** in the UI. +5. Optionally, the user provides a rejection reason. **Resume Phase:** -6. **Approved** tools execute normally and return results -7. **Rejected** tools return a rejection message — the LLM sees this and responds accordingly +6. **Approved** tools execute normally and return results. +7. **Rejected** tools return a rejection message. The LLM sees this and responds accordingly. ### Parallel Tool Approval -When an agent generates multiple tool calls simultaneously, all pending approvals are presented together. Users can approve/reject individually or in batch. +When an agent generates multiple tool calls simultaneously, the UI presents all pending approvals together. You can approve or reject each tool call individually or in batch. ### Rejection Reasons -When rejecting a tool call, users can provide a free-text explanation. This reason is passed back to the LLM as context, helping it understand why the tool was blocked and adjust its approach. +When you reject a tool call, you can provide a free-text explanation. This reason is passed back to the LLM as context, helping it understand why the tool was blocked and adjust its approach. --- ## Ask User Tool -The `ask_user` tool is a built-in tool automatically added to every agent. It allows agents to pose questions to users with optional predefined choices during execution. +The `ask_user` tool is a built-in tool that is automatically added to every agent. It allows agents to pose questions to users with optional predefined choices during execution. For example, an agent might ask "Which types of Kubernetes resources should I check?" and present options like Pods, Deployments, and Services as selectable choices. -Use cases: -- Clarifying ambiguous user requests -- Offering choices between implementation approaches -- Collecting configuration preferences -- Getting confirmation on proposed plans +Common use cases include the following. + +- Clarifying ambiguous user requests. +- Offering choices between implementation approaches. +- Collecting configuration preferences. +- Getting confirmation on proposed plans. ### Question Types | Type | Configuration | UI Rendering | |------|--------------|--------------| -| Single-select | `choices: [...]`, `multiple: false` | Choice chips (select one) | -| Multi-select | `choices: [...]`, `multiple: true` | Choice chips (select many) | -| Free-text | `choices: []` | Text input field | +| Single-select | `choices: [...]`, `multiple: false` | Choice chips (select one). | +| Multi-select | `choices: [...]`, `multiple: true` | Choice chips (select many). | +| Free-text | `choices: []` | Text input field. | ### No Configuration Required @@ -128,7 +131,8 @@ User <-- UI <-- A2A Event <-- Executor <---- ADK <----+ User --> UI --> A2A Message --> Executor --> ADK --> Tool (resumes) ``` -Key design principles: -- **Deterministic replay** — Approved calls re-invoke via ADK preprocessor without additional LLM calls -- **Minimal custom logic** — The executor only handles the resume path -- **Unified mechanism** — Both tool approval and ask_user share the same `request_confirmation` infrastructure +Key design principles include the following. + +- **Deterministic replay.** Approved calls re-invoke via ADK preprocessor without additional LLM calls. +- **Minimal custom logic.** The executor only handles the resume path. +- **Unified mechanism.** Both tool approval and ask_user share the same `request_confirmation` infrastructure. diff --git a/src/app/docs/kagent/concepts/multi-runtime/page.mdx b/src/app/docs/kagent/concepts/multi-runtime/page.mdx index ee3f22d..7d7ac54 100644 --- a/src/app/docs/kagent/concepts/multi-runtime/page.mdx +++ b/src/app/docs/kagent/concepts/multi-runtime/page.mdx @@ -12,7 +12,7 @@ export const metadata = { # Multi-Runtime Support (Go / Python ADK) -kagent supports two Agent Development Kit (ADK) runtimes for declarative agents. +You can choose between two **Agent Development Kit (ADK)** runtimes for your declarative agents. ## Overview @@ -35,10 +35,11 @@ apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: python-agent + namespace: kagent spec: type: Declarative declarative: - runtime: python + runtime: python # Default runtime modelConfig: default-model-config systemMessage: "You are a helpful agent." ``` @@ -50,10 +51,11 @@ apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: go-agent + namespace: kagent spec: type: Declarative declarative: - runtime: go + runtime: go # Faster startup, lower resource usage modelConfig: default-model-config systemMessage: "You are a fast-starting agent." ``` @@ -61,34 +63,35 @@ spec: ## When to Use Which **Choose Go when:** -- Fast startup matters (autoscaling, cold starts) -- Lower resource consumption is important -- You don't need Python-specific framework integrations +- Fast startup matters (autoscaling, cold starts). +- Lower resource consumption is important. +- You don't need Python-specific framework integrations. **Choose Python when:** -- You need Google ADK-native features -- You want to use CrewAI, LangGraph, or OpenAI framework integrations -- You need Python-based custom tools or skills +- You need Google ADK-native features. +- You want to use CrewAI, LangGraph, or OpenAI framework integrations. +- You need Python-based custom tools or skills. ## Go ADK Built-in Tools | Tool | Description | |------|-------------| -| `SkillsTool` | Discover and load skills from the skills directory | -| `BashTool` | Execute shell commands with timeout handling | -| `ReadFile` | Read file contents with line numbers and pagination | -| `WriteFile` | Write content to files (creates directories as needed) | -| `EditFile` | String replacement with ambiguity detection | +| `SkillsTool` | Discover and load skills from the skills directory. | +| `BashTool` | Execute shell commands with timeout handling. | +| `ReadFile` | Read file contents with line numbers and pagination. | +| `WriteFile` | Write content to files (creates directories as needed). | +| `EditFile` | String replacement with ambiguity detection. | ## BYO (Bring Your Own) Agents -For maximum flexibility, bring your own agent container: +For maximum flexibility, you can bring your own agent container. ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: custom-agent + namespace: kagent spec: type: BYO byo: diff --git a/src/app/docs/kagent/concepts/prompt-templates/page.mdx b/src/app/docs/kagent/concepts/prompt-templates/page.mdx index 1e3e8b9..e51a458 100644 --- a/src/app/docs/kagent/concepts/prompt-templates/page.mdx +++ b/src/app/docs/kagent/concepts/prompt-templates/page.mdx @@ -12,38 +12,40 @@ export const metadata = { # Prompt Templates -kagent supports Go `text/template` syntax in Agent system messages, enabling composition from reusable fragments stored in ConfigMaps. +You can use Go `text/template` syntax in Agent system messages to compose reusable fragments stored in ConfigMaps. ## Overview -Instead of duplicating safety guidelines and tool usage instructions in every agent, you can: -1. Store common prompt fragments in ConfigMaps -2. Reference them using `{{include "source/key"}}` syntax -3. Use agent context variables for dynamic interpolation +Instead of duplicating safety guidelines and tool usage instructions in every agent, you can take the following approach. -Template resolution happens during controller reconciliation — the final system message is fully expanded before reaching the agent runtime. +1. Store common prompt fragments in ConfigMaps. +2. Reference them using `{{include "source/key"}}` syntax. +3. Use agent context variables for dynamic interpolation. + +The controller resolves templates during reconciliation. The final system message is fully expanded before reaching the agent runtime. ## Built-in Prompt Templates -kagent ships a `kagent-builtin-prompts` ConfigMap with five reusable templates: +The `kagent-builtin-prompts` ConfigMap ships with five reusable templates. | Template Key | Description | |-------------|-------------| -| `skills-usage` | Instructions for discovering and using skills | -| `tool-usage-best-practices` | Best practices for tool invocation | -| `safety-guardrails` | Safety and operational guardrails | -| `kubernetes-context` | Kubernetes-specific operational context | -| `a2a-communication` | Agent-to-agent communication guidelines | +| `skills-usage` | Instructions for discovering and using skills. | +| `tool-usage-best-practices` | Best practices for tool invocation. | +| `safety-guardrails` | Safety and operational guardrails. | +| `kubernetes-context` | Kubernetes-specific operational context. | +| `a2a-communication` | Agent-to-agent communication guidelines. | ## Usage -Each data source in `promptTemplate.dataSources` references a ConfigMap by `name` and `kind`, with an optional `alias` for shorter include directives: +Each data source in `promptTemplate.dataSources` references a ConfigMap by `name` and `kind`, with an optional `alias` for shorter include directives. ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: k8s-agent + namespace: kagent spec: type: Declarative declarative: @@ -52,7 +54,7 @@ spec: dataSources: - kind: ConfigMap name: kagent-builtin-prompts - alias: builtin + alias: builtin # Use "builtin/key" in include directives - kind: ConfigMap name: my-custom-prompts systemMessage: | @@ -66,25 +68,28 @@ spec: Your skills: {{.SkillNames}} ``` -When an `alias` is set, use `include("alias/key")`. Otherwise, use `include("name/key")`. +When you set an `alias`, use `include("alias/key")`. Otherwise, use `include("name/key")`. ### Available Template Variables | Variable | Description | |----------|-------------| -| `{{.AgentName}}` | Name of the Agent resource | -| `{{.AgentNamespace}}` | Namespace of the Agent resource | -| `{{.Description}}` | Agent description | -| `{{.ToolNames}}` | Comma-separated list of tool names | -| `{{.SkillNames}}` | Comma-separated list of skill names | +| `{{.AgentName}}` | Name of the Agent resource. | +| `{{.AgentNamespace}}` | Namespace of the Agent resource. | +| `{{.Description}}` | Agent description. | +| `{{.ToolNames}}` | Comma-separated list of tool names. | +| `{{.SkillNames}}` | Comma-separated list of skill names. | ### Creating Custom Prompt Templates +You can create your own prompt templates by adding keys to a ConfigMap. + ```yaml apiVersion: v1 kind: ConfigMap metadata: name: my-custom-prompts + namespace: kagent data: incident-response: | ## Incident Response Guidelines @@ -98,10 +103,10 @@ data: ## How It Works -1. The controller watches ConfigMaps referenced in `promptTemplate.dataSources` -2. During reconciliation, `{{include "alias/key"}}` directives are resolved -3. Template variables are interpolated -4. The fully expanded system message is written to the ADK config -5. ConfigMap changes trigger automatic re-reconciliation +1. The controller watches ConfigMaps referenced in `promptTemplate.dataSources`. +2. During reconciliation, the controller resolves `{{include "alias/key"}}` directives. +3. The controller interpolates template variables. +4. The controller writes the fully expanded system message to the ADK config. +5. ConfigMap changes trigger automatic re-reconciliation. -> **Security Note:** Only ConfigMaps are supported as data sources — Secret references were intentionally excluded to avoid leaking sensitive data into prompts sent to LLM providers. +> **Security Note:** Only ConfigMaps are supported as data sources. Secret references were intentionally excluded to avoid leaking sensitive data into prompts sent to LLM providers. diff --git a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx index 257aa92..d84cbaf 100644 --- a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx +++ b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx @@ -12,161 +12,164 @@ export const metadata = { # Tools Ecosystem -kagent provides a rich set of built-in tools through MCP (Model Context Protocol) servers, plus the ability to add custom tools. Tools are served by two primary MCP servers: `kagent-tool-server` (Kubernetes, Helm, Istio, Cilium, Argo) and the `kagent-grafana-mcp` server (Grafana, Prometheus, Loki, Incidents). +You can use a rich set of built-in tools through **Model Context Protocol (MCP)** servers, plus add your own custom tools. Two primary MCP servers serve the tools: `kagent-tool-server` (Kubernetes, Helm, Istio, Cilium, Argo) and `kagent-grafana-mcp` (Grafana, Prometheus, Loki, Incidents). ## kagent-tool-server Tools ### Kubernetes -Comprehensive cluster management tools: +The following tools provide comprehensive cluster management. | Tool | Description | |------|-------------| -| `k8s_get_resources` | Query resources (pods, deployments, services, etc.) | -| `k8s_describe_resource` | Detailed resource information | -| `k8s_get_resource_yaml` | Get YAML representation of a resource | -| `k8s_get_pod_logs` | Retrieve pod logs | -| `k8s_get_events` | Get cluster events | -| `k8s_get_available_api_resources` | List supported API resources | -| `k8s_get_cluster_configuration` | Retrieve cluster configuration | -| `k8s_check_service_connectivity` | Test service connectivity | -| `k8s_execute_command` | Execute commands in pods | -| `k8s_patch_resource` | Patch resources with strategic merge | -| `k8s_label_resource` | Add labels to resources | -| `k8s_remove_label` | Remove labels from resources | -| `k8s_annotate_resource` | Add annotations to resources | -| `k8s_remove_annotation` | Remove annotations from resources | -| `k8s_delete_resource` | Delete resources | -| `k8s_apply_manifest` | Apply YAML manifests | -| `k8s_create_resource` | Create a resource from a local file | -| `k8s_create_resource_from_url` | Create a resource from a URL | -| `k8s_generate_resource` | Generate YAML for Istio, Gateway API, or Argo resources | +| `k8s_get_resources` | Query resources (pods, deployments, services, etc.). | +| `k8s_describe_resource` | Get detailed resource information. | +| `k8s_get_resource_yaml` | Get YAML representation of a resource. | +| `k8s_get_pod_logs` | Retrieve pod logs. | +| `k8s_get_events` | Get cluster events. | +| `k8s_get_available_api_resources` | List supported API resources. | +| `k8s_get_cluster_configuration` | Retrieve cluster configuration. | +| `k8s_check_service_connectivity` | Test service connectivity. | +| `k8s_execute_command` | Execute commands in pods. | +| `k8s_patch_resource` | Patch resources with strategic merge. | +| `k8s_label_resource` | Add labels to resources. | +| `k8s_remove_label` | Remove labels from resources. | +| `k8s_annotate_resource` | Add annotations to resources. | +| `k8s_remove_annotation` | Remove annotations from resources. | +| `k8s_delete_resource` | Delete resources. | +| `k8s_apply_manifest` | Apply YAML manifests. | +| `k8s_create_resource` | Create a resource from a local file. | +| `k8s_create_resource_from_url` | Create a resource from a URL. | +| `k8s_generate_resource` | Generate YAML for Istio, Gateway API, or Argo resources. | ### Helm | Tool | Description | |------|-------------| -| `helm_list_releases` | List installed releases | -| `helm_get_release` | Get details of a specific release | -| `helm_upgrade` | Upgrade a release | -| `helm_uninstall` | Remove a release | -| `helm_repo_add` | Add chart repository | -| `helm_repo_update` | Update chart repositories | +| `helm_list_releases` | List installed releases. | +| `helm_get_release` | Get details of a specific release. | +| `helm_upgrade` | Upgrade a release. | +| `helm_uninstall` | Remove a release. | +| `helm_repo_add` | Add a chart repository. | +| `helm_repo_update` | Update chart repositories. | ### Istio | Tool | Description | |------|-------------| -| `istio_proxy_status` | Check proxy synchronization status | -| `istio_proxy_config` | Inspect proxy configuration | -| `istio_install_istio` | Install Istio | -| `istio_generate_manifest` | Generate installation manifests | -| `istio_analyze_cluster_configuration` | Analyze Istio configuration for issues | -| `istio_version` | Get Istio version info | -| `istio_remote_clusters` | Manage remote cluster configuration | -| `istio_waypoint_status` | Get waypoint proxy status | -| `istio_list_waypoints` | List waypoint proxies | -| `istio_generate_waypoint` | Generate waypoint configuration | -| `istio_apply_waypoint` | Apply waypoint configuration | -| `istio_delete_waypoint` | Delete a waypoint proxy | -| `istio_ztunnel_config` | Inspect ztunnel configuration | +| `istio_proxy_status` | Check proxy synchronization status. | +| `istio_proxy_config` | Inspect proxy configuration. | +| `istio_install_istio` | Install Istio. | +| `istio_generate_manifest` | Generate installation manifests. | +| `istio_analyze_cluster_configuration` | Analyze Istio configuration for issues. | +| `istio_version` | Get Istio version info. | +| `istio_remote_clusters` | Manage remote cluster configuration. | +| `istio_waypoint_status` | Get waypoint proxy status. | +| `istio_list_waypoints` | List waypoint proxies. | +| `istio_generate_waypoint` | Generate waypoint configuration. | +| `istio_apply_waypoint` | Apply waypoint configuration. | +| `istio_delete_waypoint` | Delete a waypoint proxy. | +| `istio_ztunnel_config` | Inspect ztunnel configuration. | ### Argo Rollouts | Tool | Description | |------|-------------| -| `argo_verify_argo_rollouts_controller_install` | Verify the Argo Rollouts controller is running | +| `argo_verify_argo_rollouts_controller_install` | Verify the Argo Rollouts controller is running. | ### Cilium -Selected tools (Cilium has 30+ tools available): +The following table shows a subset of Cilium tools. Cilium has 30+ tools available. | Tool | Description | |------|-------------| -| `cilium_status_and_version` | Check Cilium status and version | -| `cilium_install_cilium` | Install Cilium | -| `cilium_upgrade_cilium` | Upgrade Cilium | -| `cilium_toggle_cluster_mesh` | Enable/disable cluster mesh | -| `cilium_show_cluster_mesh_status` | View cluster mesh status | -| `cilium_list_bgp_peers` | View BGP peers | -| `cilium_list_bgp_routes` | View BGP routes | -| `cilium_get_endpoints_list` | List endpoints | -| `cilium_get_endpoint_details` | Get endpoint details | -| `cilium_validate_cilium_network_policies` | Validate network policies | -| `cilium_toggle_hubble` | Enable/disable Hubble observability | +| `cilium_status_and_version` | Check Cilium status and version. | +| `cilium_install_cilium` | Install Cilium. | +| `cilium_upgrade_cilium` | Upgrade Cilium. | +| `cilium_toggle_cluster_mesh` | Enable or disable cluster mesh. | +| `cilium_show_cluster_mesh_status` | View cluster mesh status. | +| `cilium_list_bgp_peers` | View BGP peers. | +| `cilium_list_bgp_routes` | View BGP routes. | +| `cilium_get_endpoints_list` | List endpoints. | +| `cilium_get_endpoint_details` | Get endpoint details. | +| `cilium_validate_cilium_network_policies` | Validate network policies. | +| `cilium_toggle_hubble` | Enable or disable Hubble observability. | ## kagent-grafana-mcp Tools -Prometheus, Grafana, Loki, and incident management tools are served by a separate `kagent-grafana-mcp` MCP server (`RemoteMCPServer`): +A separate `kagent-grafana-mcp` MCP server (`RemoteMCPServer`) serves tools for Prometheus, Grafana, Loki, and incident management. ### Prometheus | Tool | Description | |------|-------------| -| `query_prometheus` | Execute PromQL queries | -| `list_prometheus_metric_names` | List available metric names | -| `list_prometheus_metric_metadata` | Get metric metadata | -| `list_prometheus_label_names` | List available label names | -| `list_prometheus_label_values` | List values for a specific label | +| `query_prometheus` | Execute PromQL queries. | +| `list_prometheus_metric_names` | List available metric names. | +| `list_prometheus_metric_metadata` | Get metric metadata. | +| `list_prometheus_label_names` | List available label names. | +| `list_prometheus_label_values` | List values for a specific label. | ### Grafana | Tool | Description | |------|-------------| -| `search_dashboards` | Search dashboards | -| `update_dashboard` | Update a dashboard | -| `get_dashboard_by_uid` | Get a dashboard by UID | -| `get_dashboard_panel_queries` | Get panel queries from a dashboard | -| `list_datasources` | List data sources | -| `get_datasource_by_name` | Get a data source by name | -| `get_datasource_by_uid` | Get a data source by UID | -| `list_alert_rules` | List alert rules | -| `get_alert_rule_by_uid` | Get a specific alert rule | -| `list_contact_points` | List notification contact points | +| `search_dashboards` | Search dashboards. | +| `update_dashboard` | Update a dashboard. | +| `get_dashboard_by_uid` | Get a dashboard by UID. | +| `get_dashboard_panel_queries` | Get panel queries from a dashboard. | +| `list_datasources` | List data sources. | +| `get_datasource_by_name` | Get a data source by name. | +| `get_datasource_by_uid` | Get a data source by UID. | +| `list_alert_rules` | List alert rules. | +| `get_alert_rule_by_uid` | Get a specific alert rule. | +| `list_contact_points` | List notification contact points. | ### Loki | Tool | Description | |------|-------------| -| `query_loki_logs` | Query logs via Loki | -| `query_loki_stats` | Query Loki statistics | -| `list_loki_label_names` | List Loki label names | -| `list_loki_label_values` | List Loki label values | +| `query_loki_logs` | Query logs via Loki. | +| `query_loki_stats` | Query Loki statistics. | +| `list_loki_label_names` | List Loki label names. | +| `list_loki_label_values` | List Loki label values. | ### Incidents & On-Call | Tool | Description | |------|-------------| -| `list_incidents` | List incidents | -| `get_incident` | Get incident details | -| `create_incident` | Create a new incident | -| `add_activity_to_incident` | Add activity to an incident | -| `list_oncall_users` | List on-call users | -| `get_current_oncall_users` | Get current on-call users | -| `list_oncall_schedules` | List on-call schedules | +| `list_incidents` | List incidents. | +| `get_incident` | Get incident details. | +| `create_incident` | Create a new incident. | +| `add_activity_to_incident` | Add activity to an incident. | +| `list_oncall_users` | List on-call users. | +| `get_current_oncall_users` | Get current on-call users. | +| `list_oncall_schedules` | List on-call schedules. | ## Agent Built-in Tools -These tools are automatically available to every agent (no configuration needed): +The following tools are automatically available to every agent without any configuration. | Tool | Description | |------|-------------| -| `ask_user` | Pose questions to users with optional choices | -| `SkillsTool` | Discover and load skills (Go ADK) | -| `bash` | Execute shell commands (Python ADK) | -| `read_file` | Read file contents with pagination (Python ADK) | -| `write_file` | Write file content (Python ADK) | -| `edit_file` | Edit files via string replacement (Python ADK) | +| `ask_user` | Pose questions to users with optional choices. | +| `SkillsTool` | Discover and load skills (Go ADK). | +| `bash` | Execute shell commands (Python ADK). | +| `read_file` | Read file contents with pagination (Python ADK). | +| `write_file` | Write file content (Python ADK). | +| `edit_file` | Edit files via string replacement (Python ADK). | ## Configuring Tools on an Agent ### Single MCP Server +The following example shows how to configure an agent with a single MCP server. + ```yaml apiVersion: kagent.dev/v1alpha2 kind: Agent metadata: name: k8s-agent + namespace: kagent spec: type: Declarative declarative: @@ -187,6 +190,8 @@ spec: ### With Tool Approval +You can require user approval for sensitive tools by adding `requireApproval`. + ```yaml tools: - type: McpServer @@ -199,14 +204,14 @@ tools: - k8s_describe_resource - k8s_delete_resource - k8s_apply_manifest - requireApproval: + requireApproval: # These tools pause for user approval - k8s_delete_resource - k8s_apply_manifest ``` ### Agent as Tool (A2A) -Use another agent as a tool via the A2A protocol: +You can use another agent as a tool via the A2A protocol. ```yaml tools: @@ -217,9 +222,9 @@ tools: ## Community / Contrib MCP Servers -Additional MCP servers available in `contrib/tools/`: +You can find additional MCP servers in `contrib/tools/`. | Server | Description | |--------|-------------| -| **GitHub MCP Server** | GitHub Copilot MCP server with tools for issues, PRs, repos, actions, and more | -| **k8sgpt MCP Server** | K8sGPT integration for AI-powered Kubernetes diagnostics | +| **GitHub MCP Server** | GitHub Copilot MCP server with tools for issues, PRs, repos, actions, and more. | +| **k8sgpt MCP Server** | K8sGPT integration for AI-powered Kubernetes diagnostics. | diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 0350032..515a6a9 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -22,21 +22,21 @@ For more details on the changes between versions, review the [kagent GitHub rele Review the main changes from kagent version 0.7 to v0.8, then continue reading for more detailed information. -* Human-in-the-Loop (HITL) — tool approval gates and interactive `ask_user` tool -* Agent Memory — vector-backed long-term memory for agents -* Go ADK runtime — new Go-based agent runtime for faster startup and lower resource usage -* Agents as MCP servers — expose A2A agents via MCP for cross-tool interoperability -* Skills — markdown knowledge documents loaded from OCI images or Git repositories -* Go workspace restructure — the Go codebase is split into `api`, `core`, and `adk` modules for composability -* Prompt templates — reusable prompt fragments from ConfigMaps using Go template syntax -* Context management — automatic event compaction for long conversations -* AWS Bedrock support — new model provider for AWS Bedrock +* Human-in-the-Loop (HITL) — tool approval gates and interactive `ask_user` tool. +* Agent Memory — vector-backed long-term memory for agents. +* Go ADK runtime — new Go-based agent runtime for faster startup and lower resource usage. +* Agents as MCP servers — expose A2A agents via MCP for cross-tool interoperability. +* Skills — markdown knowledge documents loaded from OCI images or Git repositories. +* Go workspace restructure — the Go codebase is split into `api`, `core`, and `adk` modules for composability. +* Prompt templates — reusable prompt fragments from ConfigMaps using Go template syntax. +* Context management — automatic event compaction for long conversations. +* AWS Bedrock support — new model provider for AWS Bedrock. ## Human-in-the-Loop (HITL) -kagent now supports two Human-in-the-Loop mechanisms that pause agent execution and wait for user input: +You can now use two Human-in-the-Loop mechanisms that pause agent execution and wait for user input. -**Tool Approval** — Mark specific tools as requiring user confirmation before execution using the `requireApproval` field in the Agent CR. When the agent tries to call an approval-required tool, the UI presents Approve/Reject buttons. Rejected tool calls include the rejection reason as context for the LLM. +**Tool Approval** — You can mark specific tools as requiring user confirmation before execution by using the `requireApproval` field in the Agent CR. When the agent tries to call an approval-required tool, the UI presents Approve/Reject buttons. Rejected tool calls include the rejection reason as context for the LLM. **Ask User** — A built-in `ask_user` tool is automatically added to every agent. Agents can pose questions to users with predefined choices (single-select, multi-select) or free-text input during execution. @@ -44,19 +44,19 @@ For more information, see the [Human-in-the-Loop](/docs/kagent/concepts/human-in ## Agent Memory -Agents can now automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on the Google ADK memory implementation and uses the same kagent database (PostgreSQL or SQLite/Turso). +Your agents can now automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on the Google ADK memory implementation and uses the same kagent database (PostgreSQL or SQLite/Turso). -When memory is enabled on an agent, three tools are injected: `save_memory`, `load_memory`, and `prefetch_memory`. The agent automatically extracts key information (user intent, key learnings, preferences) every 5th user message. +When you enable memory on an agent, it receives three additional tools: `save_memory`, `load_memory`, and `prefetch_memory`. The agent automatically extracts key information (user intent, key learnings, preferences) every 5th user message. -Configure memory in the Agent CR or through the UI when creating/editing an agent by selecting an embedding model and TTL. +You can configure memory in the Agent CR or through the UI when you create or edit an agent by selecting an embedding model and TTL. For more information, see the [Agent Memory](/docs/kagent/concepts/agent-memory) concept guide. ## Go ADK Runtime -kagent now supports two Agent Development Kit runtimes: **Python** (default) and **Go**. The Go ADK provides significantly faster startup (~2 seconds vs ~15 seconds for Python) and lower resource consumption. +You can now choose between two Agent Development Kit runtimes: **Python** (default) and **Go**. The Go ADK provides significantly faster startup (~2 seconds vs ~15 seconds for Python) and lower resource consumption. -Select the runtime via the `runtime` field in the declarative agent spec: +Select the runtime via the `runtime` field in the declarative agent spec. ```yaml spec: @@ -71,54 +71,55 @@ For more information, see the [Multi-Runtime Support](/docs/kagent/concepts/mult ## Agents as MCP Servers -A2A agents are now exposed as MCP servers via the kagent controller HTTP server. This enables cross-tool interoperability — agents can be consumed by any MCP-compatible client, not just through the A2A protocol. +A2A agents are now exposed as MCP servers via the kagent controller HTTP server. This enables cross-tool interoperability — any MCP-compatible client can consume agents, not just the A2A protocol. ## Skills -Agents can now load markdown-based knowledge documents (skills) that provide domain-specific instructions, best practices, and procedures. Skills are loaded at agent startup and discoverable through the built-in `SkillsTool`. +Your agents can now load markdown-based knowledge documents (skills) that provide domain-specific instructions, best practices, and procedures. Skills load at agent startup and are discoverable through the built-in `SkillsTool`. -kagent supports two skill sources: -- **OCI images** — Container images containing skill files -- **Git repositories** — Clone skills directly from Git repos, with support for private repos via HTTPS token or SSH key authentication +You can load skills from two sources. + +- **OCI images.** Container images containing skill files. +- **Git repositories.** Clone skills directly from Git repos, with support for private repos via HTTPS token or SSH key authentication. For more information, see the [Git-Based Skills](/docs/kagent/concepts/git-based-skills) concept guide. ## Go Workspace Restructure -The Go code is restructured into a Go workspace with three modules: `api`, `core`, and `adk`. This makes the codebase more composable for users who want to pull in parts of kagent (such as the API types or ADK) without importing all dependencies. +The Go code now uses a Go workspace with three modules: `api`, `core`, and `adk`. This makes the codebase more composable for you if you want to pull in parts of kagent (such as the API types or ADK) without importing all dependencies. | Module | Purpose | |--------|---------| -| `go/api` | Shared types: CRDs, ADK config types, database models, HTTP client | -| `go/core` | Infrastructure: controllers, HTTP server, CLI | -| `go/adk` | Go Agent Development Kit runtime | +| `go/api` | Shared types: CRDs, ADK config types, database models, HTTP client. | +| `go/core` | Infrastructure: controllers, HTTP server, CLI. | +| `go/adk` | Go Agent Development Kit runtime. | ## Prompt Templates -Agent system messages now support Go `text/template` syntax. Store common prompt fragments (safety guardrails, tool usage best practices) in ConfigMaps and reference them with `{{include "alias/key"}}` syntax. +Agent system messages now support Go `text/template` syntax. You can store common prompt fragments (safety guardrails, tool usage best practices) in ConfigMaps and reference them with `{{include "alias/key"}}` syntax. -kagent ships a `kagent-builtin-prompts` ConfigMap with five reusable templates: `skills-usage`, `tool-usage-best-practices`, `safety-guardrails`, `kubernetes-context`, and `a2a-communication`. +The `kagent-builtin-prompts` ConfigMap ships with five reusable templates: `skills-usage`, `tool-usage-best-practices`, `safety-guardrails`, `kubernetes-context`, and `a2a-communication`. For more information, see the [Prompt Templates](/docs/kagent/concepts/prompt-templates) concept guide. ## Context Management -Long conversations can now be automatically compacted to stay within LLM context windows. Configure the `context.compaction` field to enable periodic summarization of older events while preserving key information. +Long conversations can now be automatically compacted to stay within LLM context windows. You can configure the `context.compaction` field to enable periodic summarization of older events while preserving key information. For more information, see the [Context Management](/docs/kagent/concepts/context-management) concept guide. ## AWS Bedrock Support -A new model provider for AWS Bedrock has been added, allowing agents to use Bedrock-hosted models. +You can now use AWS Bedrock as a model provider, allowing your agents to use Bedrock-hosted models. ## Additional Changes -- **API key passthrough** for ModelConfig -- **Custom service account** override in agent CRDs -- **Voice support** for agents -- **UI dynamic provider model discovery** for easier model configuration -- **CLI `--token` flag** for `kagent invoke` API key passthrough -- **CVE fixes** across Go, Python, and container images +- **API key passthrough** for ModelConfig. +- **Custom service account** override in agent CRDs. +- **Voice support** for agents. +- **UI dynamic provider model discovery** for easier model configuration. +- **CLI `--token` flag** for `kagent invoke` API key passthrough. +- **CVE fixes** across Go, Python, and container images. # v0.7 From 8e82391f4eb83bd27de7335143ccbbbb523ad369 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:21:31 -0400 Subject: [PATCH 08/27] replace ASCII art diagram with structured prose in HITL architecture section Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Art Berger --- .../concepts/human-in-the-loop/page.mdx | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx index abe012c..fb0878b 100644 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -117,22 +117,16 @@ The `ask_user` tool is added unconditionally to every agent as a built-in tool. ## Architecture Summary -``` -User --> UI --> A2A Message --> Executor --> ADK --> Tool - | - request_confirmation() - | - <-- input_required --> - | -User <-- UI <-- A2A Event <-- Executor <---- ADK <----+ - | - v (Approve/Reject/Answer) - | -User --> UI --> A2A Message --> Executor --> ADK --> Tool (resumes) -``` +Both tool approval and `ask_user` share the same underlying flow through the ADK `request_confirmation` mechanism. + +### Request flow + +1. **User → UI → Executor → ADK → Tool.** The user sends a message. The UI forwards it as an A2A message to the executor, which invokes the ADK, which calls the tool. +2. **Tool → ADK → Executor → UI → User.** The tool calls `request_confirmation()`. The ADK emits an `input_required` event. The executor sends an A2A event to the UI, which displays approval controls or questions to the user. +3. **User → UI → Executor → ADK → Tool (resumes).** The user approves, rejects, or answers. The UI sends the response back through the same chain. The ADK resumes the tool with the result. -Key design principles include the following. +### Design principles - **Deterministic replay.** Approved calls re-invoke via ADK preprocessor without additional LLM calls. - **Minimal custom logic.** The executor only handles the resume path. -- **Unified mechanism.** Both tool approval and ask_user share the same `request_confirmation` infrastructure. +- **Unified mechanism.** Both tool approval and `ask_user` share the same `request_confirmation` infrastructure. From ef2a384cc109b6a1076c5bd70dd1a5c404bd6ce1 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:33:11 -0400 Subject: [PATCH 09/27] add diagram for hitl the rendering of the codeblock did not work Signed-off-by: Art Berger --- public/images/kagent-hitl.svg | 4 ++++ src/app/docs/kagent/concepts/human-in-the-loop/page.mdx | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 public/images/kagent-hitl.svg diff --git a/public/images/kagent-hitl.svg b/public/images/kagent-hitl.svg new file mode 100644 index 0000000..29fc2ed --- /dev/null +++ b/public/images/kagent-hitl.svg @@ -0,0 +1,4 @@ + + +UserUserUIUIExecutorExecutorADKADKToolToolTool requires approvalSend messageA2A MessageInvoke agentCall toolrequest_confirmation()input_required eventA2A EventShow Approve / RejectApproveA2A MessageResumeExecute toolReturn resultReject (with reason)A2A MessageResume with rejectionPass rejection to LLM[Approved][Rejected]alt \ No newline at end of file diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx index fb0878b..fc61d1a 100644 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx @@ -119,6 +119,8 @@ The `ask_user` tool is added unconditionally to every agent as a built-in tool. Both tool approval and `ask_user` share the same underlying flow through the ADK `request_confirmation` mechanism. +![HITL architecture diagram](/images/kagent-hitl.svg) + ### Request flow 1. **User → UI → Executor → ADK → Tool.** The user sends a message. The UI forwards it as an A2A message to the executor, which invokes the ADK, which calls the tool. From d912bd0b91aaabfcd1b6a0a0096be26072e9bc49 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:33:17 -0400 Subject: [PATCH 10/27] navigation Signed-off-by: Art Berger --- public/sitemap.xml | 265 ++++++++++++++++++++++--------------- src/config/navigation.json | 10 +- 2 files changed, 162 insertions(+), 113 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index 64d3b78..b409246 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,756 +2,805 @@ https://kagent.dev/agents - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/blog - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/community - 2026-02-16 + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/agent-memory + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agents - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/concepts/architecture - 2026-02-16 + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/context-management + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/git-based-skills + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/human-in-the-loop + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/multi-runtime + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/concepts - 2026-02-16 + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/prompt-templates + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/concepts/tools - 2026-02-16 + 2026-03-11 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/tools-ecosystem + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-agents - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-byo - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/agents-mcp - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/crewai-byo - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/discord-a2a - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/documentation - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/langchain-byo - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/skills - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/examples/slack-a2a - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-mcp-tool - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/local-development - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/quickstart - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/system-prompts - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/introduction/installation - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/introduction - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/introduction/what-is-kagent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/observability/audit-prompts - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/observability/launch-ui - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/observability - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/observability/tracing - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/operations/debug - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/operations/operational-considerations - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/operations - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/operations/uninstall - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/operations/upgrade - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/api-ref - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-build - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-completion - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-deploy - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-get - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-help - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-init - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-install - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-invoke - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-mcp - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-run - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-version - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/faq - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/helm - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/resources/release-notes - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/anthropic - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/azure-openai - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/byo-openai - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/gemini - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/google-vertexai - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/ollama - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/openai - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/install-controller - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/deploy - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/server - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/develop/fastmcp-python - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/develop/mcp-go - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/develop - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/introduction - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/quickstart - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/api-ref - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-add-tool - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-build - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-completion - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-deploy - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-help - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-init - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-install - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-run - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-secrets - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/reference - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs/kmcp/secrets - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/docs - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/enterprise - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/page.tsx - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/argo-rollouts-conversion-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/cilium-crd-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/helm-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/istio-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/k8s-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/kgateway-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/observability-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/agents/promql-agent - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/istio - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/kubernetes - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/prometheus - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/documentation - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/helm - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/argo - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/grafana - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/other - 2026-02-16 + 2026-03-11 weekly 0.8 https://kagent.dev/tools/cilium - 2026-02-16 + 2026-03-11 weekly 0.8 diff --git a/src/config/navigation.json b/src/config/navigation.json index cdb85dc..4cb9da5 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -87,22 +87,22 @@ { "title": "Tools Ecosystem", "href": "/docs/kagent/concepts/tools-ecosystem", - "description": "Comprehensive catalog of built-in tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." + "description": "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." }, { "title": "Human-in-the-Loop", "href": "/docs/kagent/concepts/human-in-the-loop", - "description": "Configure tool approval gates and interactive user prompts for agent oversight." + "description": "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions." }, { "title": "Agent Memory", "href": "/docs/kagent/concepts/agent-memory", - "description": "Enable vector-backed long-term memory for agents using pgvector or Turso." + "description": "Enable vector-backed long-term memory for agents to learn from past interactions." }, { "title": "Prompt Templates", "href": "/docs/kagent/concepts/prompt-templates", - "description": "Compose reusable prompt fragments from ConfigMaps using Go template syntax." + "description": "Use Go template syntax to compose reusable prompt fragments from ConfigMaps." }, { "title": "Multi-Runtime Support", @@ -117,7 +117,7 @@ { "title": "Context Management", "href": "/docs/kagent/concepts/context-management", - "description": "Automatically summarize older messages to stay within LLM context windows." + "description": "Automatically summarize older messages to stay within LLM context windows during long conversations." } ] }, From 1b954000cdfd505c6d8d84de9c05fe99a7f10e90 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 11 Mar 2026 10:47:09 -0400 Subject: [PATCH 11/27] revise based on testing Signed-off-by: Art Berger --- .../concepts/context-management/page.mdx | 23 +++++++++++-- .../kagent/concepts/tools-ecosystem/page.mdx | 32 ++++++++++++++++--- .../kagent/resources/release-notes/page.mdx | 8 ++--- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/app/docs/kagent/concepts/context-management/page.mdx b/src/app/docs/kagent/concepts/context-management/page.mdx index 6bd3637..d9cea4c 100644 --- a/src/app/docs/kagent/concepts/context-management/page.mdx +++ b/src/app/docs/kagent/concepts/context-management/page.mdx @@ -41,12 +41,31 @@ spec: | `compactionInterval` | `5` | Number of new user invocations before triggering a compaction. | | `overlapSize` | `2` | Number of preceding invocations to include for context overlap. | | `eventRetentionSize` | — | Number of most recent events to always retain. | +| `tokenThreshold` | — | Post-invocation token threshold. When the prompt token count meets or exceeds this value, compaction triggers. | +| `summarizer` | — | Optional LLM-based summarizer configuration (see below). | + +### Summarizer + +By default, compacted events are dropped from the context without summarization. To preserve a summary of compacted events, configure the `summarizer` field. + +```yaml +context: + compaction: + compactionInterval: 5 + summarizer: + modelConfig: summarizer-model-config # Optional: uses agent's own model if omitted +``` + +| Field | Description | +|-------|-------------| +| `summarizer.modelConfig` | Name of a `ModelConfig` resource to use for summarization. If omitted, the agent's own model is used. | +| `summarizer.promptTemplate` | Custom prompt template for the summarizer. | ## How It Works 1. As the conversation progresses, events accumulate in the session history. -2. When the history approaches the model's context limit, the agent triggers compaction. -3. The agent summarizes older events while preserving key decisions, important tool results, and critical context from earlier in the conversation. +2. Compaction triggers when one of two conditions is met: the number of new user invocations reaches the `compactionInterval`, or the prompt token count exceeds the `tokenThreshold` (if set). +3. If a `summarizer` is configured, older events are summarized by an LLM. Otherwise, compacted events are dropped from the context. 4. The agent continues with the compacted history seamlessly. ## When to Use diff --git a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx index d84cbaf..bd4c1cc 100644 --- a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx +++ b/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx @@ -41,6 +41,8 @@ The following tools provide comprehensive cluster management. | `k8s_create_resource` | Create a resource from a local file. | | `k8s_create_resource_from_url` | Create a resource from a URL. | | `k8s_generate_resource` | Generate YAML for Istio, Gateway API, or Argo resources. | +| `k8s_rollout` | Manage rollouts (restart, status, history). | +| `k8s_scale` | Scale a resource (deployment, statefulset, etc.). | ### Helm @@ -76,6 +78,13 @@ The following tools provide comprehensive cluster management. | Tool | Description | |------|-------------| | `argo_verify_argo_rollouts_controller_install` | Verify the Argo Rollouts controller is running. | +| `argo_rollouts_list` | List Argo Rollouts in a namespace. | +| `argo_promote_rollout` | Promote a paused rollout. | +| `argo_pause_rollout` | Pause a rollout. | +| `argo_set_rollout_image` | Set the image of a rollout. | +| `argo_check_plugin_logs` | Check Argo Rollouts plugin logs. | +| `argo_verify_kubectl_plugin_install` | Verify the kubectl Argo Rollouts plugin is installed. | +| `argo_verify_gateway_plugin` | Verify the Argo Rollouts gateway plugin. | ### Cilium @@ -95,6 +104,21 @@ The following table shows a subset of Cilium tools. Cilium has 30+ tools availab | `cilium_validate_cilium_network_policies` | Validate network policies. | | `cilium_toggle_hubble` | Enable or disable Hubble observability. | +### Kubescape + +| Tool | Description | +|------|-------------| +| `kubescape_check_health` | Check Kubescape health status. | +| `kubescape_list_vulnerabilities` | List vulnerabilities. | +| `kubescape_get_vulnerability_details` | Get details of a specific vulnerability. | +| `kubescape_list_vulnerability_manifests` | List vulnerability manifests. | +| `kubescape_list_configuration_scans` | List configuration scans. | +| `kubescape_get_configuration_scan` | Get a specific configuration scan. | +| `kubescape_list_application_profiles` | List application profiles. | +| `kubescape_get_application_profile` | Get a specific application profile. | +| `kubescape_list_network_neighborhoods` | List network neighborhoods. | +| `kubescape_get_network_neighborhood` | Get a specific network neighborhood. | + ## kagent-grafana-mcp Tools A separate `kagent-grafana-mcp` MCP server (`RemoteMCPServer`) serves tools for Prometheus, Grafana, Loki, and incident management. @@ -118,11 +142,9 @@ A separate `kagent-grafana-mcp` MCP server (`RemoteMCPServer`) serves tools for | `get_dashboard_by_uid` | Get a dashboard by UID. | | `get_dashboard_panel_queries` | Get panel queries from a dashboard. | | `list_datasources` | List data sources. | -| `get_datasource_by_name` | Get a data source by name. | -| `get_datasource_by_uid` | Get a data source by UID. | -| `list_alert_rules` | List alert rules. | -| `get_alert_rule_by_uid` | Get a specific alert rule. | -| `list_contact_points` | List notification contact points. | +| `get_datasource` | Get a data source by name or UID. | +| `alerting_manage_rules` | Manage alert rules (list, create, update, delete). | +| `alerting_manage_routing` | Manage alerting routing, notification policies, and contact points. | ### Loki diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 515a6a9..2171620 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -187,7 +187,7 @@ Review the main changes from kagent version 0.5 to v0.6, then continue reading f * API string references to resources in other namespaces in the format `namespace/name` now fail. Instead, the APIs have a separate field for you to specify the namespace of the resource. * The Tools API moves or eliminates some APIs entirely in favor of new kmcp APIs. * The Agents APIs now require a top-level `type` field to support the new BYO agent functionality. -* The ModelConfig APIs rename the secret name field from `apiKeySecret` to `apiKeySecret`. +* The ModelConfig APIs rename the secret name field from `apiKeySecretRef` to `apiKeySecret`. * Memory APIs are not supported in ADK. ## Upgraded API version @@ -503,7 +503,7 @@ This change supports the new type for BYO agents.
-[v1alpha2 Example](https://github.com/kagent-dev/kagent/blob/eitanya/byo/helm/agents/k8s/templates/agent.yaml): Note that the entire agent configuration is now nested under the `inline` setting. +[v1alpha2 Example](https://github.com/kagent-dev/kagent/blob/eitanya/byo/helm/agents/k8s/templates/agent.yaml): Note that the entire agent configuration is now nested under the `declarative` setting. ```yaml apiVersion: kagent.dev/v1alpha2 @@ -524,7 +524,7 @@ This change supports the new type for BYO agents. **Key Changes:** * Added `type: Declarative` field to specify agent type - * Agent configuration now under `inline` section + * Agent configuration now under `declarative` section * Supports new BYO deployment model
@@ -556,7 +556,7 @@ spec: ## ModelConfig API -The secret name field is renamed from `apiKeySecret` to `apiKeySecret`. +The secret name field is renamed from `apiKeySecretRef` to `apiKeySecret`. ### ModelInfo removed From 2be6f1b7d199bdacfae86112babcfb8cce55ba61 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 09:31:14 -0400 Subject: [PATCH 12/27] de-dupe Signed-off-by: Art Berger --- src/app/docs/kagent/concepts/agents/page.mdx | 33 +++++ .../concepts/human-in-the-loop/page.mdx | 134 ------------------ src/config/navigation.json | 10 +- 3 files changed, 38 insertions(+), 139 deletions(-) delete mode 100644 src/app/docs/kagent/concepts/human-in-the-loop/page.mdx diff --git a/src/app/docs/kagent/concepts/agents/page.mdx b/src/app/docs/kagent/concepts/agents/page.mdx index 4aeb1c1..7676199 100644 --- a/src/app/docs/kagent/concepts/agents/page.mdx +++ b/src/app/docs/kagent/concepts/agents/page.mdx @@ -48,6 +48,39 @@ Some tools support additional configuration that can be set in when adding the t Kagent comes with a set of built-in tools that you can use to interact with your environment. Kagent also supports the [MCP (Model Configuration Protocol)](https://modelcontextprotocol.io/introduction) tools. Using MCP, you can bring any external tool into kagent and make it available for your agents to run. +## Human-in-the-Loop + +Kagent supports Human-in-the-Loop (HITL) to keep humans in control of agent actions. You can require user approval before an agent executes sensitive tools, and agents can ask users questions when they need clarification. + +For a hands-on tutorial that walks through setting up HITL with tool approval and the `ask_user` tool, see the [Human-in-the-Loop example](/docs/kagent/examples/human-in-the-loop). + +### Tool approval + +Add `requireApproval` to your agent's tool specification to gate destructive operations. Tools listed in `requireApproval` pause execution and present Approve/Reject buttons in the UI. Tools not listed run immediately. + +```yaml +tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + kind: RemoteMCPServer + apiGroup: kagent.dev + toolNames: + - k8s_get_resources # runs immediately + - k8s_describe_resource # runs immediately + - k8s_delete_resource # pauses for approval + - k8s_apply_manifest # pauses for approval + requireApproval: + - k8s_delete_resource + - k8s_apply_manifest +``` + +When you reject a tool call, you can provide a reason. This reason is passed back to the LLM as context, so the agent can adjust its approach. + +### Ask User + +Every agent automatically has the built-in `ask_user` tool. It allows agents to pause and ask users questions with optional predefined choices — useful for clarifying ambiguous requests or collecting configuration preferences. No configuration is required. + ## Skills Skills are descriptions or even executable implementations of the capabilities that an agent has to act more autonomously. They make the LLM's responses more than just reactions to prompts by orienting them toward goals. diff --git a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx b/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx deleted file mode 100644 index fc61d1a..0000000 --- a/src/app/docs/kagent/concepts/human-in-the-loop/page.mdx +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "Human-in-the-Loop" -pageOrder: 4 -description: "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions." ---- - -export const metadata = { - title: "Human-in-the-Loop", - description: "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions.", - author: "kagent.dev" -}; - -# Human-in-the-Loop (HITL) - -You can use two Human-in-the-Loop mechanisms to maintain oversight of agent actions. - -1. **Tool Approval.** Require user confirmation before executing sensitive tools. -2. **Ask User.** Allow agents to interactively ask users questions during execution. - -Both features pause agent execution and wait for user input before continuing. - -## Tool Approval - -### Overview - -Tool approval lets you mark specific tools as requiring user confirmation before execution. When an agent attempts to call an approval-required tool, execution pauses and the UI presents Approve/Reject buttons. - -Tool approval is useful for destructive or sensitive operations. - -- Deleting Kubernetes resources. -- Writing files. -- Executing shell commands. -- Modifying infrastructure. - -### Configuration - -You configure tool approval in the Agent CR (not in the UI). Add `requireApproval` to your Agent's tool specification. The values must be a subset of `toolNames`. - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: k8s-agent - namespace: kagent -spec: - type: Declarative - declarative: - modelConfig: default-model-config - systemMessage: "You are a Kubernetes management agent." - tools: - - type: McpServer - mcpServer: - apiGroup: kagent.dev - name: kagent-tool-server - kind: RemoteMCPServer - toolNames: - - k8s_get_resources - - k8s_describe_resource - - k8s_delete_resource - - k8s_apply_manifest - requireApproval: # These tools pause for user approval - - k8s_delete_resource - - k8s_apply_manifest -``` - -In this example, `k8s_get_resources` and `k8s_describe_resource` execute immediately, but `k8s_delete_resource` and `k8s_apply_manifest` pause for user approval. - -### How It Works - -**Interrupt Phase:** -1. The agent calls a tool marked for approval. -2. The ADK generates an `adk_request_confirmation` event. -3. The UI receives the event and displays approval controls. - -**Decision Phase:** -4. The user clicks **Approve** or **Reject** in the UI. -5. Optionally, the user provides a rejection reason. - -**Resume Phase:** -6. **Approved** tools execute normally and return results. -7. **Rejected** tools return a rejection message. The LLM sees this and responds accordingly. - -### Parallel Tool Approval - -When an agent generates multiple tool calls simultaneously, the UI presents all pending approvals together. You can approve or reject each tool call individually or in batch. - -### Rejection Reasons - -When you reject a tool call, you can provide a free-text explanation. This reason is passed back to the LLM as context, helping it understand why the tool was blocked and adjust its approach. - ---- - -## Ask User Tool - -The `ask_user` tool is a built-in tool that is automatically added to every agent. It allows agents to pose questions to users with optional predefined choices during execution. - -For example, an agent might ask "Which types of Kubernetes resources should I check?" and present options like Pods, Deployments, and Services as selectable choices. - -Common use cases include the following. - -- Clarifying ambiguous user requests. -- Offering choices between implementation approaches. -- Collecting configuration preferences. -- Getting confirmation on proposed plans. - -### Question Types - -| Type | Configuration | UI Rendering | -|------|--------------|--------------| -| Single-select | `choices: [...]`, `multiple: false` | Choice chips (select one). | -| Multi-select | `choices: [...]`, `multiple: true` | Choice chips (select many). | -| Free-text | `choices: []` | Text input field. | - -### No Configuration Required - -The `ask_user` tool is added unconditionally to every agent as a built-in tool. You don't need to add it to your Agent spec — it's always available. - -## Architecture Summary - -Both tool approval and `ask_user` share the same underlying flow through the ADK `request_confirmation` mechanism. - -![HITL architecture diagram](/images/kagent-hitl.svg) - -### Request flow - -1. **User → UI → Executor → ADK → Tool.** The user sends a message. The UI forwards it as an A2A message to the executor, which invokes the ADK, which calls the tool. -2. **Tool → ADK → Executor → UI → User.** The tool calls `request_confirmation()`. The ADK emits an `input_required` event. The executor sends an A2A event to the UI, which displays approval controls or questions to the user. -3. **User → UI → Executor → ADK → Tool (resumes).** The user approves, rejects, or answers. The UI sends the response back through the same chain. The ADK resumes the tool with the result. - -### Design principles - -- **Deterministic replay.** Approved calls re-invoke via ADK preprocessor without additional LLM calls. -- **Minimal custom logic.** The executor only handles the resume path. -- **Unified mechanism.** Both tool approval and `ask_user` share the same `request_confirmation` infrastructure. diff --git a/src/config/navigation.json b/src/config/navigation.json index 4cb9da5..57ee6a8 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -89,11 +89,6 @@ "href": "/docs/kagent/concepts/tools-ecosystem", "description": "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." }, - { - "title": "Human-in-the-Loop", - "href": "/docs/kagent/concepts/human-in-the-loop", - "description": "Configure tool approval workflows and the Ask User interactive tool for human oversight of agent actions." - }, { "title": "Agent Memory", "href": "/docs/kagent/concepts/agent-memory", @@ -213,6 +208,11 @@ "href": "/docs/kagent/examples/discord-a2a", "description": "Learn how to create a Discord bot that interacts with kagent via A2A" }, + { + "title": "Human-in-the-Loop", + "href": "/docs/kagent/examples/human-in-the-loop", + "description": "Build a Kubernetes-native AI agent that pauses for approval before taking destructive actions." + }, { "title": "Skills", "href": "/docs/kagent/examples/skills", From d7431a899e40583aa83f18b79503ac15732b2ee6 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 09:39:34 -0400 Subject: [PATCH 13/27] add links to blogs Signed-off-by: Art Berger --- src/app/docs/kagent/resources/release-notes/page.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 2171620..e0f033b 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -40,7 +40,7 @@ You can now use two Human-in-the-Loop mechanisms that pause agent execution and **Ask User** — A built-in `ask_user` tool is automatically added to every agent. Agents can pose questions to users with predefined choices (single-select, multi-select) or free-text input during execution. -For more information, see the [Human-in-the-Loop](/docs/kagent/concepts/human-in-the-loop) concept guide. +For more information, see the [Human-in-the-Loop example](/docs/kagent/examples/human-in-the-loop) and the [blog post](/blog/human-in-the-loop-kagent). ## Agent Memory @@ -67,7 +67,7 @@ spec: The Go ADK includes built-in tools: `SkillsTool`, `BashTool`, `ReadFile`, `WriteFile`, and `EditFile`. -For more information, see the [Multi-Runtime Support](/docs/kagent/concepts/multi-runtime) concept guide. +For more information, see the [Multi-Runtime Support](/docs/kagent/concepts/multi-runtime) concept guide and the [blog post](/blog/go-vs-python-runtime). ## Agents as MCP Servers From be8c5eb25508d2f6c7233e27c662d23b2142f0d7 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 10:57:36 -0400 Subject: [PATCH 14/27] doc updates Signed-off-by: Art Berger --- src/app/docs/kagent/concepts/agents/page.mdx | 143 ++++++++++++++++++ .../kagent/concepts/architecture/page.mdx | 9 +- .../concepts/context-management/page.mdx | 86 ----------- .../kagent/concepts/git-based-skills/page.mdx | 142 ----------------- .../kagent/concepts/multi-runtime/page.mdx | 107 ------------- .../kagent/concepts/prompt-templates/page.mdx | 112 -------------- src/app/docs/kagent/concepts/tools/page.mdx | 2 +- .../kagent/resources/release-notes/page.mdx | 8 +- .../tools-ecosystem/page.mdx | 0 src/config/navigation.json | 30 +--- 10 files changed, 159 insertions(+), 480 deletions(-) delete mode 100644 src/app/docs/kagent/concepts/context-management/page.mdx delete mode 100644 src/app/docs/kagent/concepts/git-based-skills/page.mdx delete mode 100644 src/app/docs/kagent/concepts/multi-runtime/page.mdx delete mode 100644 src/app/docs/kagent/concepts/prompt-templates/page.mdx rename src/app/docs/kagent/{concepts => resources}/tools-ecosystem/page.mdx (100%) diff --git a/src/app/docs/kagent/concepts/agents/page.mdx b/src/app/docs/kagent/concepts/agents/page.mdx index 7676199..df759c1 100644 --- a/src/app/docs/kagent/concepts/agents/page.mdx +++ b/src/app/docs/kagent/concepts/agents/page.mdx @@ -34,6 +34,60 @@ Instructions are an important part of the agent's behavior. They define the agen Writing good instructions is an art and a science. It requires a good understanding of the task at hand, the tools available, and the user's needs. In order to make it easier to write good instructions, we've created a [system prompt tutorial](/docs/kagent/getting-started/system-prompts) that can help you get started. +### Prompt templates + +You can use Go `text/template` syntax in system messages to compose reusable fragments stored in ConfigMaps. Instead of duplicating safety guidelines and tool usage instructions across every agent, store them once and reference them with `{{include "alias/key"}}` syntax. The controller resolves templates during reconciliation, so the final system message is fully expanded before reaching the agent runtime. + +```yaml +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: k8s-agent + namespace: kagent +spec: + type: Declarative + declarative: + modelConfig: default-model-config + promptTemplate: + dataSources: + - kind: ConfigMap + name: kagent-builtin-prompts + alias: builtin + - kind: ConfigMap + name: my-custom-prompts + systemMessage: | + You are a Kubernetes management agent named {{.AgentName}}. + + {{include "builtin/safety-guardrails"}} + {{include "builtin/tool-usage-best-practices"}} + {{include "my-custom-prompts/k8s-specific-rules"}} + + Your tools: {{.ToolNames}} + Your skills: {{.SkillNames}} +``` + +The `kagent-builtin-prompts` ConfigMap ships with five reusable templates. + +| Template Key | Description | +|-------------|-------------| +| `skills-usage` | Instructions for discovering and using skills. | +| `tool-usage-best-practices` | Best practices for tool invocation. | +| `safety-guardrails` | Safety and operational guardrails. | +| `kubernetes-context` | Kubernetes-specific operational context. | +| `a2a-communication` | Agent-to-agent communication guidelines. | + +The following template variables are available in system messages. + +| Variable | Description | +|----------|-------------| +| `{{.AgentName}}` | Name of the Agent resource. | +| `{{.AgentNamespace}}` | Namespace of the Agent resource. | +| `{{.Description}}` | Agent description. | +| `{{.ToolNames}}` | Comma-separated list of tool names. | +| `{{.SkillNames}}` | Comma-separated list of skill names. | + +> **Security Note:** Only ConfigMaps are supported as data sources. Secret references were intentionally excluded to avoid leaking sensitive data into prompts sent to LLM providers. + ## Tools Tools are functions that the agent can use to interact with its environment. For example, a Kubernetes agent might have tools to list pods, get pod logs, and describe services. @@ -141,6 +195,33 @@ Container-based skills are actual, callable capabilities—not just descriptions Kagent's skills are similar to [Claude's Agent Skills](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview), but with a key advantage: any agent can use skills, regardless of the LLM provider. You're not limited to Anthropic Claude. You can use skills with OpenAI, Google Vertex AI, Azure OpenAI, Ollama, and any other LLM provider that kagent supports. +### Git-based skills + +You can also load skills directly from Git repositories, as an alternative to OCI images. + +```yaml +skills: + gitRefs: + - url: https://github.com/myorg/agent-skills.git + ref: main + - url: https://github.com/myorg/monorepo.git + ref: main + path: skills/kubernetes # Use a subdirectory +``` + +For private repositories, configure authentication via HTTPS token or SSH key. + +```yaml +skills: + gitAuthSecretRef: + name: git-credentials # Secret containing a `token` key + gitRefs: + - url: https://github.com/myorg/private-skills.git + ref: main +``` + +A single `gitAuthSecretRef` applies to all Git repositories in the agent. You can combine Git and OCI skills in the same agent by specifying both `refs` and `gitRefs`. + ### Best practices for skills Containerize and store your skills in a specialized registry so that you can reuse them across agents. You can use the [agentregistry project](https://github.com/agentregistry-dev/agentregistry) to build and push skills to a registry. @@ -155,6 +236,68 @@ When creating skills for your agents, consider the following best practices. Age To learn more about using skills in your agents, see the [Skills example guide](/docs/kagent/examples/skills). +## Runtime + +You can choose between two Agent Development Kit (ADK) runtimes for declarative agents: **Python** (default) and **Go**. + +| Feature | Python ADK | Go ADK | +|---------|-----------|--------| +| Startup time | ~15 seconds | ~2 seconds | +| Ecosystem | Google ADK, LangGraph, CrewAI integrations | Native Go implementation | +| Resource usage | Higher (Python runtime) | Lower (compiled binary) | +| Default | Yes | No | +| Memory support | Yes | Yes | +| MCP support | Yes | Yes | +| HITL support | Yes | Yes | + +Select the runtime via the `runtime` field in the declarative agent spec. + +```yaml +spec: + type: Declarative + declarative: + runtime: go # or "python" (default) + modelConfig: default-model-config + systemMessage: "You are a helpful agent." +``` + +**Choose Go when** fast startup matters (autoscaling, cold starts), lower resource consumption is important, or you don't need Python-specific framework integrations. + +**Choose Python when** you need Google ADK-native features, CrewAI/LangGraph/OpenAI framework integrations, or Python-based custom tools. + +For more benchmarks and details, see the [Go vs Python runtime blog post](/blog/go-vs-python-runtime). + +## Memory + +Your agents can save and retrieve relevant context across conversations using vector similarity search. When you enable memory on an agent, it receives three additional tools (`save_memory`, `load_memory`, `prefetch_memory`) and automatically extracts key information every 5th user message. + +For configuration details, supported storage backends, API endpoints, and limitations, see the [Agent Memory](/docs/kagent/concepts/agent-memory) concept guide. + +## Context Management + +Long conversations can exceed LLM context windows. You can enable **event compaction** to automatically summarize older messages while preserving key information. + +```yaml +spec: + type: Declarative + declarative: + modelConfig: default-model-config + systemMessage: "You are a helpful agent for extended sessions." + context: + compaction: + compactionInterval: 5 # Compact every 5 user invocations +``` + +| Field | Default | Description | +|-------|---------|-------------| +| `compactionInterval` | `5` | Number of new user invocations before triggering a compaction. | +| `overlapSize` | `2` | Number of preceding invocations to include for context overlap. | +| `eventRetentionSize` | — | Number of most recent events to always retain. | +| `tokenThreshold` | — | Post-invocation token threshold that triggers compaction. | +| `summarizer` | — | Optional LLM-based summarizer configuration. | + +By default, compacted events are dropped. To preserve a summary, configure the `summarizer` field with a `modelConfig` reference. Enable compaction for agents that handle long-running conversations, call many tools with large outputs, or need to support extended interactions. + ## Agents as Tools Kagent also supports using agents as tools. Any agent you create can be referenced and used by other agents you have. An example use case would be to have a PromQL agent that knows how to create PromQL queries from natural language. Then you'd create a second agent that would use the PromQL agent whenever it needs to create a PromQL query. diff --git a/src/app/docs/kagent/concepts/architecture/page.mdx b/src/app/docs/kagent/concepts/architecture/page.mdx index 7274c84..857ed74 100644 --- a/src/app/docs/kagent/concepts/architecture/page.mdx +++ b/src/app/docs/kagent/concepts/architecture/page.mdx @@ -28,11 +28,14 @@ In the future, we envision more features for the controller, such as: ## App/Engine -The kagent engine is the core component of kagent. It is a Python application that is responsible for running the agent's conversation loop. It is built on top of the [ADK](https://google.github.io/adk-docs/) framework. +The kagent engine is the core component of kagent. It runs the agent's conversation loop and supports two runtimes: -The ADK team did a wonderful job of creating a flexible, powerful, and most importantly extensible framework for building AI agents. We take full advantage of this by using the framework by adding our own `Agents`, and `Tools`. +- **Python ADK** (default) — Built on top of the [Google ADK](https://google.github.io/adk-docs/) framework. Supports Google ADK-native features and integrations with CrewAI, LangGraph, and OpenAI frameworks. +- **Go ADK** — A native Go implementation that provides faster startup (~2 seconds vs ~15 seconds) and lower resource consumption. Select it by setting `runtime: go` in the agent spec. -Please see the following links for more information on the ADK framework: +Both runtimes support MCP tools, HITL, and agent memory. For more details, see the [Agents](/docs/kagent/concepts/agents#runtime) concept guide. + +For more information on the Google ADK framework: - [Agents](https://google.github.io/adk-docs/agents/) - [Tools](https://google.github.io/adk-docs/tools/) diff --git a/src/app/docs/kagent/concepts/context-management/page.mdx b/src/app/docs/kagent/concepts/context-management/page.mdx deleted file mode 100644 index d9cea4c..0000000 --- a/src/app/docs/kagent/concepts/context-management/page.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Context Management" -pageOrder: 9 -description: "Automatically summarize older messages to stay within LLM context windows during long conversations." ---- - -export const metadata = { - title: "Context Management", - description: "Automatically summarize older messages to stay within LLM context windows during long conversations.", - author: "kagent.dev" -}; - -# Context Management - -Long conversations can exceed LLM context windows. With **event compaction**, you can automatically summarize older messages to preserve key information while reducing token count. - -## Configuration - -To enable compaction, set the `context.compaction` field on the declarative agent spec. - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: long-conversation-agent - namespace: kagent -spec: - type: Declarative - declarative: - modelConfig: default-model-config - systemMessage: "You are a helpful agent for extended sessions." - context: - compaction: - compactionInterval: 5 # Compact every 5 user invocations -``` - -### Configuration Options - -| Field | Default | Description | -|-------|---------|-------------| -| `compactionInterval` | `5` | Number of new user invocations before triggering a compaction. | -| `overlapSize` | `2` | Number of preceding invocations to include for context overlap. | -| `eventRetentionSize` | — | Number of most recent events to always retain. | -| `tokenThreshold` | — | Post-invocation token threshold. When the prompt token count meets or exceeds this value, compaction triggers. | -| `summarizer` | — | Optional LLM-based summarizer configuration (see below). | - -### Summarizer - -By default, compacted events are dropped from the context without summarization. To preserve a summary of compacted events, configure the `summarizer` field. - -```yaml -context: - compaction: - compactionInterval: 5 - summarizer: - modelConfig: summarizer-model-config # Optional: uses agent's own model if omitted -``` - -| Field | Description | -|-------|-------------| -| `summarizer.modelConfig` | Name of a `ModelConfig` resource to use for summarization. If omitted, the agent's own model is used. | -| `summarizer.promptTemplate` | Custom prompt template for the summarizer. | - -## How It Works - -1. As the conversation progresses, events accumulate in the session history. -2. Compaction triggers when one of two conditions is met: the number of new user invocations reaches the `compactionInterval`, or the prompt token count exceeds the `tokenThreshold` (if set). -3. If a `summarizer` is configured, older events are summarized by an LLM. Otherwise, compacted events are dropped from the context. -4. The agent continues with the compacted history seamlessly. - -## When to Use - -Enable event compaction when your agents meet the following criteria. - -- Agents handle long-running conversations (debugging sessions, investigations). -- Agents call many tools that generate large outputs. -- You want to support extended interactions without hitting context limits. - -You may not need event compaction for the following scenarios. - -- Short, single-turn interactions. -- Agents with small tool sets that generate compact outputs. - -## Context Caching Note - -Prompt caching (a separate optimization that caches the prompt prefix for faster responses) is **not** configured at the agent level. Most LLM providers enable prompt caching by default. diff --git a/src/app/docs/kagent/concepts/git-based-skills/page.mdx b/src/app/docs/kagent/concepts/git-based-skills/page.mdx deleted file mode 100644 index 9a948aa..0000000 --- a/src/app/docs/kagent/concepts/git-based-skills/page.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: "Git-Based Skills" -pageOrder: 8 -description: "Load markdown knowledge documents from Git repositories to guide agent behavior." ---- - -export const metadata = { - title: "Git-Based Skills", - description: "Load markdown knowledge documents from Git repositories to guide agent behavior.", - author: "kagent.dev" -}; - -# Git-Based Skills - -Skills are markdown-based knowledge documents that agents load at startup. You can use skills to provide domain-specific instructions, best practices, and procedures that guide agent behavior. - -You can load skills from two sources. - -- **OCI images.** Container images containing skill files (original approach). -- **Git repositories.** Clone skills directly from Git repos. - -## Skill File Format - -Each skill is a directory containing a `SKILL.md` file with YAML frontmatter. - -```markdown ---- -name: kubernetes-troubleshooting -description: Guide for diagnosing and fixing common Kubernetes issues ---- - -# Kubernetes Troubleshooting - -## Pod Crash Loops - -When a pod is in CrashLoopBackOff: - -1. Check logs: `kubectl logs --previous` -2. Check events: `kubectl describe pod ` -3. Verify resource limits... -``` - -## Git Repository Configuration - -### Basic Example - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: my-agent - namespace: kagent -spec: - type: Declarative - declarative: - modelConfig: default-model-config - systemMessage: "You are a helpful agent." - skills: - gitRefs: - - url: https://github.com/myorg/agent-skills.git - ref: main -``` - -### With Subdirectory - -You can specify a subdirectory within the repository to use as the skill root. - -```yaml -skills: - gitRefs: - - url: https://github.com/myorg/monorepo.git - ref: main - path: skills/kubernetes # Only use this subdirectory -``` - -### Multiple Sources - -You can combine Git and OCI skills in the same agent. - -```yaml -skills: - refs: - - ghcr.io/myorg/k8s-skills:latest - gitRefs: - - url: https://github.com/myorg/skills-repo.git - ref: main - - url: https://github.com/myorg/another-repo.git - ref: develop - path: agent-skills -``` - -## Authentication - -### HTTPS Token Auth - -```yaml -apiVersion: v1 -kind: Secret -metadata: - name: git-credentials - namespace: kagent -type: Opaque -stringData: - token: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -``` - -```yaml -skills: - gitAuthSecretRef: - name: git-credentials - gitRefs: - - url: https://github.com/myorg/private-skills.git - ref: main -``` - -### SSH Key Auth - -```yaml -skills: - gitAuthSecretRef: - name: git-ssh-key - gitRefs: - - url: git@github.com:myorg/private-skills.git - ref: main -``` - -> A single `gitAuthSecretRef` applies to all Git repositories in the agent. All repos must use the same authentication method. - -## How It Works - -Under the hood, a lightweight init container (~30MB) containing Git and krane tools runs before the agent pod starts. - -1. The `skills-init` container clones each Git repository to the skills volume. -2. The container pulls any OCI skill images. -3. The agent runtime discovers skills from the mounted volume at startup. - -## Skill Discovery at Runtime - -Once loaded, skills are available through the built-in `SkillsTool`. - -- **List skills.** The agent calls the tool with no arguments to see available skills. -- **Load skill.** The agent calls the tool with a skill name to get the full content. diff --git a/src/app/docs/kagent/concepts/multi-runtime/page.mdx b/src/app/docs/kagent/concepts/multi-runtime/page.mdx deleted file mode 100644 index 7d7ac54..0000000 --- a/src/app/docs/kagent/concepts/multi-runtime/page.mdx +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: "Multi-Runtime Support" -pageOrder: 7 -description: "Choose between Go and Python ADK runtimes for your agents." ---- - -export const metadata = { - title: "Multi-Runtime Support", - description: "Choose between Go and Python ADK runtimes for your agents.", - author: "kagent.dev" -}; - -# Multi-Runtime Support (Go / Python ADK) - -You can choose between two **Agent Development Kit (ADK)** runtimes for your declarative agents. - -## Overview - -| Feature | Python ADK | Go ADK | -|---------|-----------|--------| -| Startup time | ~15 seconds | ~2 seconds | -| Ecosystem | Google ADK, LangGraph, CrewAI integrations | Native Go implementation | -| Resource usage | Higher (Python runtime) | Lower (compiled binary) | -| Default | Yes | No | -| Memory support | Yes | Yes | -| MCP support | Yes | Yes | -| HITL support | Yes | Yes | - -## Configuration - -### Python Runtime (Default) - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: python-agent - namespace: kagent -spec: - type: Declarative - declarative: - runtime: python # Default runtime - modelConfig: default-model-config - systemMessage: "You are a helpful agent." -``` - -### Go Runtime - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: go-agent - namespace: kagent -spec: - type: Declarative - declarative: - runtime: go # Faster startup, lower resource usage - modelConfig: default-model-config - systemMessage: "You are a fast-starting agent." -``` - -## When to Use Which - -**Choose Go when:** -- Fast startup matters (autoscaling, cold starts). -- Lower resource consumption is important. -- You don't need Python-specific framework integrations. - -**Choose Python when:** -- You need Google ADK-native features. -- You want to use CrewAI, LangGraph, or OpenAI framework integrations. -- You need Python-based custom tools or skills. - -## Go ADK Built-in Tools - -| Tool | Description | -|------|-------------| -| `SkillsTool` | Discover and load skills from the skills directory. | -| `BashTool` | Execute shell commands with timeout handling. | -| `ReadFile` | Read file contents with line numbers and pagination. | -| `WriteFile` | Write content to files (creates directories as needed). | -| `EditFile` | String replacement with ambiguity detection. | - -## BYO (Bring Your Own) Agents - -For maximum flexibility, you can bring your own agent container. - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: custom-agent - namespace: kagent -spec: - type: BYO - byo: - deployment: - image: myregistry/my-custom-agent:v1.0 - replicas: 1 - resources: - requests: - memory: "512Mi" - cpu: "500m" -``` - -BYO agents must implement the A2A protocol endpoint for communication with the kagent platform. diff --git a/src/app/docs/kagent/concepts/prompt-templates/page.mdx b/src/app/docs/kagent/concepts/prompt-templates/page.mdx deleted file mode 100644 index e51a458..0000000 --- a/src/app/docs/kagent/concepts/prompt-templates/page.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "Prompt Templates" -pageOrder: 6 -description: "Use Go template syntax to compose reusable prompt fragments from ConfigMaps." ---- - -export const metadata = { - title: "Prompt Templates", - description: "Use Go template syntax to compose reusable prompt fragments from ConfigMaps.", - author: "kagent.dev" -}; - -# Prompt Templates - -You can use Go `text/template` syntax in Agent system messages to compose reusable fragments stored in ConfigMaps. - -## Overview - -Instead of duplicating safety guidelines and tool usage instructions in every agent, you can take the following approach. - -1. Store common prompt fragments in ConfigMaps. -2. Reference them using `{{include "source/key"}}` syntax. -3. Use agent context variables for dynamic interpolation. - -The controller resolves templates during reconciliation. The final system message is fully expanded before reaching the agent runtime. - -## Built-in Prompt Templates - -The `kagent-builtin-prompts` ConfigMap ships with five reusable templates. - -| Template Key | Description | -|-------------|-------------| -| `skills-usage` | Instructions for discovering and using skills. | -| `tool-usage-best-practices` | Best practices for tool invocation. | -| `safety-guardrails` | Safety and operational guardrails. | -| `kubernetes-context` | Kubernetes-specific operational context. | -| `a2a-communication` | Agent-to-agent communication guidelines. | - -## Usage - -Each data source in `promptTemplate.dataSources` references a ConfigMap by `name` and `kind`, with an optional `alias` for shorter include directives. - -```yaml -apiVersion: kagent.dev/v1alpha2 -kind: Agent -metadata: - name: k8s-agent - namespace: kagent -spec: - type: Declarative - declarative: - modelConfig: default-model-config - promptTemplate: - dataSources: - - kind: ConfigMap - name: kagent-builtin-prompts - alias: builtin # Use "builtin/key" in include directives - - kind: ConfigMap - name: my-custom-prompts - systemMessage: | - You are a Kubernetes management agent named {{.AgentName}}. - - {{include "builtin/safety-guardrails"}} - {{include "builtin/tool-usage-best-practices"}} - {{include "my-custom-prompts/k8s-specific-rules"}} - - Your tools: {{.ToolNames}} - Your skills: {{.SkillNames}} -``` - -When you set an `alias`, use `include("alias/key")`. Otherwise, use `include("name/key")`. - -### Available Template Variables - -| Variable | Description | -|----------|-------------| -| `{{.AgentName}}` | Name of the Agent resource. | -| `{{.AgentNamespace}}` | Namespace of the Agent resource. | -| `{{.Description}}` | Agent description. | -| `{{.ToolNames}}` | Comma-separated list of tool names. | -| `{{.SkillNames}}` | Comma-separated list of skill names. | - -### Creating Custom Prompt Templates - -You can create your own prompt templates by adding keys to a ConfigMap. - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-custom-prompts - namespace: kagent -data: - incident-response: | - ## Incident Response Guidelines - When responding to incidents: - 1. Assess the severity (P1-P4) - 2. Check affected services and dependencies - 3. Review recent deployments and changes - 4. Collect relevant logs and metrics - 5. Propose remediation steps -``` - -## How It Works - -1. The controller watches ConfigMaps referenced in `promptTemplate.dataSources`. -2. During reconciliation, the controller resolves `{{include "alias/key"}}` directives. -3. The controller interpolates template variables. -4. The controller writes the fully expanded system message to the ADK config. -5. ConfigMap changes trigger automatic re-reconciliation. - -> **Security Note:** Only ConfigMaps are supported as data sources. Secret references were intentionally excluded to avoid leaking sensitive data into prompts sent to LLM providers. diff --git a/src/app/docs/kagent/concepts/tools/page.mdx b/src/app/docs/kagent/concepts/tools/page.mdx index f61b7d5..4405770 100644 --- a/src/app/docs/kagent/concepts/tools/page.mdx +++ b/src/app/docs/kagent/concepts/tools/page.mdx @@ -18,7 +18,7 @@ Kagent comes with a set of built-in tools that you can use to interact with your ## Built-in Tools -You can check out the full list of built-in tools [here](/tools). +You can check out the full list of built-in tools [here](/tools), or see the [Tools Ecosystem](/docs/kagent/resources/tools-ecosystem) reference for a detailed catalog of tools organized by MCP server. The built-in tools are meant as a good starting point for any agents running in kubernetes, however we don't envision them covering all possible use-cases, so we support multiple tool extension points to allow you to bring in your own tools. diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index e0f033b..937f4b7 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -67,7 +67,7 @@ spec: The Go ADK includes built-in tools: `SkillsTool`, `BashTool`, `ReadFile`, `WriteFile`, and `EditFile`. -For more information, see the [Multi-Runtime Support](/docs/kagent/concepts/multi-runtime) concept guide and the [blog post](/blog/go-vs-python-runtime). +For more information, see the [Agents](/docs/kagent/concepts/agents#runtime) concept guide and the [blog post](/blog/go-vs-python-runtime). ## Agents as MCP Servers @@ -82,7 +82,7 @@ You can load skills from two sources. - **OCI images.** Container images containing skill files. - **Git repositories.** Clone skills directly from Git repos, with support for private repos via HTTPS token or SSH key authentication. -For more information, see the [Git-Based Skills](/docs/kagent/concepts/git-based-skills) concept guide. +For more information, see the [Agents](/docs/kagent/concepts/agents#git-based-skills) concept guide. ## Go Workspace Restructure @@ -100,13 +100,13 @@ Agent system messages now support Go `text/template` syntax. You can store commo The `kagent-builtin-prompts` ConfigMap ships with five reusable templates: `skills-usage`, `tool-usage-best-practices`, `safety-guardrails`, `kubernetes-context`, and `a2a-communication`. -For more information, see the [Prompt Templates](/docs/kagent/concepts/prompt-templates) concept guide. +For more information, see the [Agents](/docs/kagent/concepts/agents#prompt-templates) concept guide. ## Context Management Long conversations can now be automatically compacted to stay within LLM context windows. You can configure the `context.compaction` field to enable periodic summarization of older events while preserving key information. -For more information, see the [Context Management](/docs/kagent/concepts/context-management) concept guide. +For more information, see the [Agents](/docs/kagent/concepts/agents#context-management) concept guide. ## AWS Bedrock Support diff --git a/src/app/docs/kagent/concepts/tools-ecosystem/page.mdx b/src/app/docs/kagent/resources/tools-ecosystem/page.mdx similarity index 100% rename from src/app/docs/kagent/concepts/tools-ecosystem/page.mdx rename to src/app/docs/kagent/resources/tools-ecosystem/page.mdx diff --git a/src/config/navigation.json b/src/config/navigation.json index 57ee6a8..dd38a84 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -84,35 +84,10 @@ "href": "/docs/kagent/concepts/tools", "description": "Understand the different types of tools kagent can use, including built-in, MCP, and HTTP tools, and how tool discovery works." }, - { - "title": "Tools Ecosystem", - "href": "/docs/kagent/concepts/tools-ecosystem", - "description": "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." - }, { "title": "Agent Memory", "href": "/docs/kagent/concepts/agent-memory", "description": "Enable vector-backed long-term memory for agents to learn from past interactions." - }, - { - "title": "Prompt Templates", - "href": "/docs/kagent/concepts/prompt-templates", - "description": "Use Go template syntax to compose reusable prompt fragments from ConfigMaps." - }, - { - "title": "Multi-Runtime Support", - "href": "/docs/kagent/concepts/multi-runtime", - "description": "Choose between Go and Python ADK runtimes for your agents." - }, - { - "title": "Git-Based Skills", - "href": "/docs/kagent/concepts/git-based-skills", - "description": "Load markdown knowledge documents from Git repositories to guide agent behavior." - }, - { - "title": "Context Management", - "href": "/docs/kagent/concepts/context-management", - "description": "Automatically summarize older messages to stay within LLM context windows during long conversations." } ] }, @@ -289,6 +264,11 @@ "href": "/docs/kagent/resources/helm", "description": "kagent Helm chart configuration reference" }, + { + "title": "Tools Ecosystem", + "href": "/docs/kagent/resources/tools-ecosystem", + "description": "Catalog of built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." + }, { "title": "FAQs", "href": "/docs/kagent/resources/faq", From 44f2d00f6f18c76d67795294129d89291b95f24a Mon Sep 17 00:00:00 2001 From: Art Date: Thu, 12 Mar 2026 11:01:21 -0400 Subject: [PATCH 15/27] docs: add missing subpage cards to all section landing pages - Concepts: add cards for Tools Ecosystem, Human-in-the-Loop, Agent Memory, Prompt Templates, Multi-Runtime, Git-Based Skills, Context Management - Getting Started: add Local Development card - Examples: add Agents via MCP, BYO CrewAI, BYO LangGraph cards - Resources: fix Helm chart href (/helm/helm -> /helm) Signed-off-by: Art Berger --- src/app/docs/kagent/concepts/page.mdx | 7 +++++++ src/app/docs/kagent/examples/page.mdx | 6 ++++-- src/app/docs/kagent/getting-started/page.mdx | 3 ++- src/app/docs/kagent/resources/page.mdx | 4 ++-- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/app/docs/kagent/concepts/page.mdx b/src/app/docs/kagent/concepts/page.mdx index 70f9a28..da4ec00 100644 --- a/src/app/docs/kagent/concepts/page.mdx +++ b/src/app/docs/kagent/concepts/page.mdx @@ -24,5 +24,12 @@ import QuickLink from '@/components/quick-link'; + + + + + + + diff --git a/src/app/docs/kagent/examples/page.mdx b/src/app/docs/kagent/examples/page.mdx index d9083c4..ce39f50 100644 --- a/src/app/docs/kagent/examples/page.mdx +++ b/src/app/docs/kagent/examples/page.mdx @@ -20,11 +20,13 @@ import QuickLink from '@/components/quick-link';
- + + + + -
diff --git a/src/app/docs/kagent/getting-started/page.mdx b/src/app/docs/kagent/getting-started/page.mdx index 7ea836e..aa21af3 100644 --- a/src/app/docs/kagent/getting-started/page.mdx +++ b/src/app/docs/kagent/getting-started/page.mdx @@ -22,6 +22,7 @@ import QuickLink from '@/components/quick-link'; + - \ No newline at end of file + diff --git a/src/app/docs/kagent/resources/page.mdx b/src/app/docs/kagent/resources/page.mdx index b40ac32..f00c034 100644 --- a/src/app/docs/kagent/resources/page.mdx +++ b/src/app/docs/kagent/resources/page.mdx @@ -21,7 +21,7 @@ import QuickLink from '@/components/quick-link';
- + @@ -29,4 +29,4 @@ import QuickLink from '@/components/quick-link';
- \ No newline at end of file + From 30ceabfbb2cb83689cf429919b146e46097d66ad Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 11:03:00 -0400 Subject: [PATCH 16/27] local preview Signed-off-by: Art Berger --- public/sitemap.xml | 274 +++++++++++++++++-------------------- src/config/navigation.json | 12 +- 2 files changed, 129 insertions(+), 157 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index b409246..8b4a01f 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,805 +2,777 @@ https://kagent.dev/agents - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/blog - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/community - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agent-memory - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agents - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/concepts/architecture - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/context-management - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/git-based-skills - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/human-in-the-loop - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/multi-runtime - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/concepts - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/prompt-templates - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/concepts/tools - 2026-03-11 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/tools-ecosystem - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-agents - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-byo - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/agents-mcp - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/crewai-byo - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/discord-a2a - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/documentation - 2026-03-11 + 2026-03-12 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/examples/human-in-the-loop + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/langchain-byo - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/skills - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/examples/slack-a2a - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-mcp-tool - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/local-development - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/quickstart - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/system-prompts - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/introduction/installation - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/introduction - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/introduction/what-is-kagent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/observability/audit-prompts - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/observability/launch-ui - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/observability - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/observability/tracing - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/operations/debug - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/operations/operational-considerations - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/operations - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/operations/uninstall - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/operations/upgrade - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/api-ref - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-build - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-completion - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-deploy - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-get - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-help - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-init - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-install - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-invoke - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-mcp - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-run - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-version - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/faq - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/helm - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/resources/release-notes - 2026-03-11 + 2026-03-12 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/resources/tools-ecosystem + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/anthropic - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/azure-openai - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/byo-openai - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/gemini - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/google-vertexai - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/ollama - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/openai - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/install-controller - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/deploy - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/server - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/develop/fastmcp-python - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/develop/mcp-go - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/develop - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/introduction - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/quickstart - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/api-ref - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-add-tool - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-build - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-completion - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-deploy - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-help - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-init - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-install - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-run - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-secrets - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/reference - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs/kmcp/secrets - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/docs - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/enterprise - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/page.tsx - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/argo-rollouts-conversion-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/cilium-crd-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/helm-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/istio-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/k8s-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/kgateway-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/observability-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/agents/promql-agent - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/istio - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/kubernetes - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/prometheus - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/documentation - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/helm - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/argo - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/grafana - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/other - 2026-03-11 + 2026-03-12 weekly 0.8 https://kagent.dev/tools/cilium - 2026-03-11 + 2026-03-12 weekly 0.8 diff --git a/src/config/navigation.json b/src/config/navigation.json index dd38a84..b37fdb4 100644 --- a/src/config/navigation.json +++ b/src/config/navigation.json @@ -183,15 +183,15 @@ "href": "/docs/kagent/examples/discord-a2a", "description": "Learn how to create a Discord bot that interacts with kagent via A2A" }, - { - "title": "Human-in-the-Loop", - "href": "/docs/kagent/examples/human-in-the-loop", - "description": "Build a Kubernetes-native AI agent that pauses for approval before taking destructive actions." - }, { "title": "Skills", "href": "/docs/kagent/examples/skills", "description": "Learn how to add skills to your agents to guide their behavior and tool usage." + }, + { + "title": "Human-in-the-Loop", + "href": "/docs/kagent/examples/human-in-the-loop", + "description": "Build a Kubernetes-native AI agent that pauses and asks for your approval before taking destructive actions." } ] }, @@ -267,7 +267,7 @@ { "title": "Tools Ecosystem", "href": "/docs/kagent/resources/tools-ecosystem", - "description": "Catalog of built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." + "description": "Explore the built-in MCP tools for Kubernetes, Helm, Istio, Prometheus, Grafana, Cilium, and Argo Rollouts." }, { "title": "FAQs", From 41dd62e63ba200dcf55b53c71694f4ca83c95753 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 11:04:59 -0400 Subject: [PATCH 17/27] fix some cards Signed-off-by: Art Berger --- src/app/docs/kagent/concepts/page.mdx | 2 +- src/app/docs/kagent/resources/page.mdx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/docs/kagent/concepts/page.mdx b/src/app/docs/kagent/concepts/page.mdx index da4ec00..c908964 100644 --- a/src/app/docs/kagent/concepts/page.mdx +++ b/src/app/docs/kagent/concepts/page.mdx @@ -24,7 +24,7 @@ import QuickLink from '@/components/quick-link'; - + diff --git a/src/app/docs/kagent/resources/page.mdx b/src/app/docs/kagent/resources/page.mdx index f00c034..9f0451c 100644 --- a/src/app/docs/kagent/resources/page.mdx +++ b/src/app/docs/kagent/resources/page.mdx @@ -22,6 +22,7 @@ import QuickLink from '@/components/quick-link'; + From 7cd219fe3fd51304a03f6d5e6e6f90316df4989e Mon Sep 17 00:00:00 2001 From: Art Berger Date: Thu, 12 Mar 2026 11:11:39 -0400 Subject: [PATCH 18/27] rm unused images Signed-off-by: Art Berger --- public/images/kagent-hitl.svg | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 public/images/kagent-hitl.svg diff --git a/public/images/kagent-hitl.svg b/public/images/kagent-hitl.svg deleted file mode 100644 index 29fc2ed..0000000 --- a/public/images/kagent-hitl.svg +++ /dev/null @@ -1,4 +0,0 @@ - - -UserUserUIUIExecutorExecutorADKADKToolToolTool requires approvalSend messageA2A MessageInvoke agentCall toolrequest_confirmation()input_required eventA2A EventShow Approve / RejectApproveA2A MessageResumeExecute toolReturn resultReject (with reason)A2A MessageResume with rejectionPass rejection to LLM[Approved][Rejected]alt \ No newline at end of file From f977b7690a92027c559ca0bc769fa539598158df Mon Sep 17 00:00:00 2001 From: Art Berger Date: Fri, 13 Mar 2026 14:57:18 -0400 Subject: [PATCH 19/27] Remove SQLite Related to https://github.com/kagent-dev/kagent/issues/1502 Signed-off-by: Art Berger --- .../kagent/concepts/agent-memory/page.mdx | 2 +- src/app/docs/kagent/resources/helm/page.mdx | 3 --- .../kagent/resources/release-notes/page.mdx | 24 ++++++++++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/app/docs/kagent/concepts/agent-memory/page.mdx b/src/app/docs/kagent/concepts/agent-memory/page.mdx index 8fe3922..398b4c7 100644 --- a/src/app/docs/kagent/concepts/agent-memory/page.mdx +++ b/src/app/docs/kagent/concepts/agent-memory/page.mdx @@ -22,7 +22,7 @@ Agent memory provides the following capabilities. - **Searchable.** Agents retrieve relevant memories via cosine similarity. - **Automatic.** Agents extract and save user intent, key learnings, and preferences without explicit user action. - **Time-bounded.** Memories expire after a configurable TTL (default 15 days). -- **Shared storage.** Memory uses the same kagent database (PostgreSQL or SQLite/Turso), not a separate database. +- **Shared storage.** Memory uses the same kagent database (PostgreSQL), not a separate database. ## Configuration diff --git a/src/app/docs/kagent/resources/helm/page.mdx b/src/app/docs/kagent/resources/helm/page.mdx index be1741a..526321c 100644 --- a/src/app/docs/kagent/resources/helm/page.mdx +++ b/src/app/docs/kagent/resources/helm/page.mdx @@ -121,9 +121,6 @@ A Helm chart for kagent, built with Google ADK | database.postgres.url | string | `"postgres://postgres:kagent@pgsql-postgresql.kagent.svc.cluster.local:5432/postgres"` | | | database.postgres.urlFile | string | `""` | | | database.postgres.vectorEnabled | bool | `true` | | -| database.sqlite.databaseName | string | `"kagent.db"` | | -| database.sqlite.vectorEnabled | bool | `true` | | -| database.type | string | `"sqlite"` | | | fullnameOverride | string | `""` | | | grafana-mcp.grafana.serviceAccountToken | string | `""` | | | grafana-mcp.grafana.url | string | `"grafana.kagent:3000/api"` | | diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 937f4b7..c0f1361 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -31,6 +31,7 @@ Review the main changes from kagent version 0.7 to v0.8, then continue reading f * Prompt templates — reusable prompt fragments from ConfigMaps using Go template syntax. * Context management — automatic event compaction for long conversations. * AWS Bedrock support — new model provider for AWS Bedrock. +* **PostgreSQL-only database backend** — SQLite support has been removed. PostgreSQL with pgvector is now the only supported database backend. ## Human-in-the-Loop (HITL) @@ -44,7 +45,7 @@ For more information, see the [Human-in-the-Loop example](/docs/kagent/examples/ ## Agent Memory -Your agents can now automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on the Google ADK memory implementation and uses the same kagent database (PostgreSQL or SQLite/Turso). +Your agents can now automatically save and retrieve relevant context across conversations using vector similarity search. Memory is built on the Google ADK memory implementation and uses the same kagent database (PostgreSQL). When you enable memory on an agent, it receives three additional tools: `save_memory`, `load_memory`, and `prefetch_memory`. The agent automatically extracts key information (user intent, key learnings, preferences) every 5th user message. @@ -112,6 +113,27 @@ For more information, see the [Agents](/docs/kagent/concepts/agents#context-mana You can now use AWS Bedrock as a model provider, allowing your agents to use Bedrock-hosted models. +## PostgreSQL-Only Database Backend + +SQLite support has been removed from kagent. PostgreSQL with pgvector is now the only supported database backend. + +**What changed:** +- The `database.type` configuration option has been removed. +- SQLite-related Helm values (`database.sqlite.*`) have been removed. +- A PostgreSQL instance with pgvector is now bundled in the Helm chart by default. +- The bundled PostgreSQL is deployed automatically when both `database.postgres.url` and `database.postgres.urlFile` are empty. + +**Why this change:** +- SQLite lacks pgvector support, requiring separate code paths for memory and vector search. +- SQLite's single-writer constraint prevents horizontal scaling of the controller. +- Divergent SQL dialects between SQLite and PostgreSQL required maintaining duplicate code paths. +- PostgreSQL was already the recommended production backend. + +**Migration:** +- If you were using the default SQLite backend, no migration is needed. The bundled PostgreSQL will be deployed automatically. +- If you were using an external PostgreSQL instance, continue using `database.postgres.url` or `database.postgres.urlFile` as before. +- Set `database.postgres.url` to skip the bundled PostgreSQL instance and use your own external PostgreSQL server. + ## Additional Changes - **API key passthrough** for ModelConfig. From 0f5a32206a0cba7a17f6a61234d2bfd001c87d9d Mon Sep 17 00:00:00 2001 From: Art Berger Date: Fri, 13 Mar 2026 15:32:20 -0400 Subject: [PATCH 20/27] more details on bundled Postgres Signed-off-by: Art Berger --- .../operational-considerations/page.mdx | 42 ++++++++++++++++--- src/app/docs/kagent/resources/helm/page.mdx | 11 +++-- .../kagent/resources/release-notes/page.mdx | 2 + 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/app/docs/kagent/operations/operational-considerations/page.mdx b/src/app/docs/kagent/operations/operational-considerations/page.mdx index 90fd281..afa851e 100644 --- a/src/app/docs/kagent/operations/operational-considerations/page.mdx +++ b/src/app/docs/kagent/operations/operational-considerations/page.mdx @@ -58,20 +58,43 @@ controller: ### More considerations for HA -- **Database requirement**: When using multiple controller replicas, use PostgreSQL as the database backend. The default in-memory database does not support multiple replicas. +- **Database requirement**: PostgreSQL is the default database backend and supports multiple controller replicas. The bundled PostgreSQL instance is deployed automatically unless you configure an external PostgreSQL. - **Leader election**: Leader election uses Kubernetes leases and is handled automatically. - **Failover**: If the leader fails, another replica automatically becomes the leader. -### Use PostgreSQL for scaling +## Database configuration -To scale the controller to multiple replicas, configure PostgreSQL as the database backend. You can enable PostgreSQL by using the Helm `--set` flag or values file. +Kagent uses PostgreSQL as the database backend. By default, a bundled PostgreSQL instance with pgvector is deployed when you install kagent. This bundled instance works out of the box with no external prerequisites. + +### Bundled PostgreSQL + +The default bundled PostgreSQL instance is deployed automatically when both `database.postgres.url` and `database.postgres.urlFile` are empty (the default). You can customize the bundled instance configuration. + +**Helm values file:** + +```yaml +database: + postgres: + vectorEnabled: true + bundled: + image: pgvector/pgvector:pg18-trixie + storage: 500Mi + database: postgres + user: postgres + password: kagent +``` + +### External PostgreSQL + +To use an external PostgreSQL instance instead of the bundled one, set `database.postgres.url` or `database.postgres.urlFile`. + +> **Note**: If your external PostgreSQL does not have the `pgvector` extension installed, set `database.postgres.vectorEnabled: false` to disable vector-based memory features. **Helm `--set` flag:** ```bash helm upgrade kagent oci://ghcr.io/kagent-dev/kagent/helm/kagent \ --namespace kagent \ - --set database.type=postgres \ --set database.postgres.url=postgres://user:password@postgres-host:5432/kagent \ --set controller.replicas=3 ``` @@ -80,13 +103,22 @@ helm upgrade kagent oci://ghcr.io/kagent-dev/kagent/helm/kagent \ ```yaml database: - type: postgres postgres: url: postgres://user:password@postgres-host:5432/kagent + vectorEnabled: true # Set to false if your external PostgreSQL doesn't have pgvector controller: replicas: 3 ``` +**Using a secret for the database URL:** This configuration expects a Kubernetes secret mounted at `/etc/secrets/database-url` containing the PostgreSQL connection string. + +```yaml +database: + postgres: + urlFile: /etc/secrets/database-url + vectorEnabled: true +``` + ## Secure execution environment Kagent supports Kubernetes security contexts to run agents and tool servers with reduced privileges. Configure `securityContext` and `podSecurityContext` on your Agent or ToolServer resources to enforce secure execution. diff --git a/src/app/docs/kagent/resources/helm/page.mdx b/src/app/docs/kagent/resources/helm/page.mdx index 526321c..799919a 100644 --- a/src/app/docs/kagent/resources/helm/page.mdx +++ b/src/app/docs/kagent/resources/helm/page.mdx @@ -118,9 +118,14 @@ A Helm chart for kagent, built with Google ADK | controller.volumeMounts | list | `[]` | | | controller.volumes | list | `[]` | | | controller.watchNamespaces | list | [] (watches all available namespaces) | Namespaces the controller should watch. If empty, the controller will watch ALL available namespaces. | -| database.postgres.url | string | `"postgres://postgres:kagent@pgsql-postgresql.kagent.svc.cluster.local:5432/postgres"` | | -| database.postgres.urlFile | string | `""` | | -| database.postgres.vectorEnabled | bool | `true` | | +| database.postgres.bundled.database | string | `"postgres"` | Database name for the bundled PostgreSQL instance | +| database.postgres.bundled.image | string | `"pgvector/pgvector:pg18-trixie"` | Container image for the bundled PostgreSQL instance | +| database.postgres.bundled.password | string | `"kagent"` | Password for the bundled PostgreSQL instance | +| database.postgres.bundled.storage | string | `"500Mi"` | Storage size for the bundled PostgreSQL instance | +| database.postgres.bundled.user | string | `"postgres"` | Username for the bundled PostgreSQL instance | +| database.postgres.url | string | `""` | PostgreSQL connection string. Leave empty to deploy the bundled postgres instance. Set this to use an external PostgreSQL. | +| database.postgres.urlFile | string | `""` | Path to a file containing the database URL. Takes precedence over url when set. Leave empty to use the bundled postgres instance. | +| database.postgres.vectorEnabled | bool | `true` | Enable pgvector extension and memory table migration. Requires pgvector to be installed on the PostgreSQL server. Set to false when using an external PostgreSQL that does not have pgvector. | | fullnameOverride | string | `""` | | | grafana-mcp.grafana.serviceAccountToken | string | `""` | | | grafana-mcp.grafana.url | string | `"grafana.kagent:3000/api"` | | diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index c0f1361..11826f5 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -122,6 +122,7 @@ SQLite support has been removed from kagent. PostgreSQL with pgvector is now the - SQLite-related Helm values (`database.sqlite.*`) have been removed. - A PostgreSQL instance with pgvector is now bundled in the Helm chart by default. - The bundled PostgreSQL is deployed automatically when both `database.postgres.url` and `database.postgres.urlFile` are empty. +- New `database.postgres.bundled.*` configuration options allow customizing the bundled PostgreSQL instance (image, storage, credentials). **Why this change:** - SQLite lacks pgvector support, requiring separate code paths for memory and vector search. @@ -133,6 +134,7 @@ SQLite support has been removed from kagent. PostgreSQL with pgvector is now the - If you were using the default SQLite backend, no migration is needed. The bundled PostgreSQL will be deployed automatically. - If you were using an external PostgreSQL instance, continue using `database.postgres.url` or `database.postgres.urlFile` as before. - Set `database.postgres.url` to skip the bundled PostgreSQL instance and use your own external PostgreSQL server. +- Customize the bundled instance via `database.postgres.bundled.*` (storage size, image, credentials) as needed. See the [installation guide](/docs/kagent/introduction/installation#database-configuration) for details. ## Additional Changes From 1d6f03bca0dc188d3937f0f391067a6fa4e83844 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Fri, 13 Mar 2026 15:36:01 -0400 Subject: [PATCH 21/27] link Signed-off-by: Art Berger --- src/app/docs/kagent/resources/release-notes/page.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index 11826f5..f4027d3 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -134,7 +134,7 @@ SQLite support has been removed from kagent. PostgreSQL with pgvector is now the - If you were using the default SQLite backend, no migration is needed. The bundled PostgreSQL will be deployed automatically. - If you were using an external PostgreSQL instance, continue using `database.postgres.url` or `database.postgres.urlFile` as before. - Set `database.postgres.url` to skip the bundled PostgreSQL instance and use your own external PostgreSQL server. -- Customize the bundled instance via `database.postgres.bundled.*` (storage size, image, credentials) as needed. See the [installation guide](/docs/kagent/introduction/installation#database-configuration) for details. +- Customize the bundled instance via `database.postgres.bundled.*` (storage size, image, credentials) as needed. See the [Database configuration guide](/operations/operational-considerations/#database-configuration) for details. ## Additional Changes From 7569e7d76a69e90f1f41ae3ef7c9fe6c806cb3bd Mon Sep 17 00:00:00 2001 From: Art Berger Date: Mon, 16 Mar 2026 09:34:45 -0400 Subject: [PATCH 22/27] emphasize external postgres for prod Signed-off-by: Art Berger --- .../kagent/introduction/installation/page.mdx | 4 ++++ .../operational-considerations/page.mdx | 8 ++++++-- .../docs/kagent/resources/release-notes/page.mdx | 15 +++++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/app/docs/kagent/introduction/installation/page.mdx b/src/app/docs/kagent/introduction/installation/page.mdx index a40ff04..011a1f3 100644 --- a/src/app/docs/kagent/introduction/installation/page.mdx +++ b/src/app/docs/kagent/introduction/installation/page.mdx @@ -197,6 +197,10 @@ Another way to install kagent is using Helm. Review the following advanced configuration options that you might want to set up for your kagent installation. +### Database configuration + +For production environments, set up kagent with an external PostgreSQL instance. For more information, see the [Database configuration guide](/operations/operational-considerations/#database-configuration). + ### Configure controller environment variables You can configure the controller by using environment variables for settings such as service names, connection details, and more. diff --git a/src/app/docs/kagent/operations/operational-considerations/page.mdx b/src/app/docs/kagent/operations/operational-considerations/page.mdx index afa851e..2269659 100644 --- a/src/app/docs/kagent/operations/operational-considerations/page.mdx +++ b/src/app/docs/kagent/operations/operational-considerations/page.mdx @@ -64,7 +64,11 @@ controller: ## Database configuration -Kagent uses PostgreSQL as the database backend. By default, a bundled PostgreSQL instance with pgvector is deployed when you install kagent. This bundled instance works out of the box with no external prerequisites. +Kagent uses PostgreSQL as the database backend. + +By default, a bundled PostgreSQL instance with pgvector is deployed when you install kagent. This bundled instance works out of the box with no external prerequisites. It is a simple instance that is meant for demos, local development, and short proofs of concept. + +For production deployments, bring your own external PostgreSQL instance. ### Bundled PostgreSQL @@ -86,7 +90,7 @@ database: ### External PostgreSQL -To use an external PostgreSQL instance instead of the bundled one, set `database.postgres.url` or `database.postgres.urlFile`. +For production environments, use an external PostgreSQL instance instead of the bundled one. To configure the external instance, use the `database.postgres.url` or `database.postgres.urlFile` settings. > **Note**: If your external PostgreSQL does not have the `pgvector` extension installed, set `database.postgres.vectorEnabled: false` to disable vector-based memory features. diff --git a/src/app/docs/kagent/resources/release-notes/page.mdx b/src/app/docs/kagent/resources/release-notes/page.mdx index f4027d3..be1cc1a 100644 --- a/src/app/docs/kagent/resources/release-notes/page.mdx +++ b/src/app/docs/kagent/resources/release-notes/page.mdx @@ -118,10 +118,9 @@ You can now use AWS Bedrock as a model provider, allowing your agents to use Bed SQLite support has been removed from kagent. PostgreSQL with pgvector is now the only supported database backend. **What changed:** -- The `database.type` configuration option has been removed. -- SQLite-related Helm values (`database.sqlite.*`) have been removed. -- A PostgreSQL instance with pgvector is now bundled in the Helm chart by default. -- The bundled PostgreSQL is deployed automatically when both `database.postgres.url` and `database.postgres.urlFile` are empty. +- The `database.type` configuration option is removed. +- SQLite-related Helm values (`database.sqlite.*`) are removed. +- A PostgreSQL instance with pgvector is now bundled in the Helm chart by default. This bundled PostgreSQL is deployed automatically when both `database.postgres.url` and `database.postgres.urlFile` are empty. - New `database.postgres.bundled.*` configuration options allow customizing the bundled PostgreSQL instance (image, storage, credentials). **Why this change:** @@ -131,10 +130,10 @@ SQLite support has been removed from kagent. PostgreSQL with pgvector is now the - PostgreSQL was already the recommended production backend. **Migration:** -- If you were using the default SQLite backend, no migration is needed. The bundled PostgreSQL will be deployed automatically. -- If you were using an external PostgreSQL instance, continue using `database.postgres.url` or `database.postgres.urlFile` as before. -- Set `database.postgres.url` to skip the bundled PostgreSQL instance and use your own external PostgreSQL server. -- Customize the bundled instance via `database.postgres.bundled.*` (storage size, image, credentials) as needed. See the [Database configuration guide](/operations/operational-considerations/#database-configuration) for details. + +If you were using the default SQLite backend, no migration is needed. The bundled PostgreSQL will be deployed automatically. You can optionally customize the bundled instance via `database.postgres.bundled.*` (storage size, image, credentials) as needed. See the [Database configuration guide](/operations/operational-considerations/#database-configuration) for details. + +Note that for production deployments, it is recommended to use your own external PostgreSQL instance. If you already are, you can keep your `database.postgres.url` or `database.postgres.urlFile` settings as before the migration. ## Additional Changes From 817d486dc4ea6e2dc9c4e4bb4e843d1543d1716f Mon Sep 17 00:00:00 2001 From: Art Berger Date: Fri, 13 Mar 2026 15:12:06 -0400 Subject: [PATCH 23/27] fix the sidebar nav Signed-off-by: Art Berger --- public/sitemap.xml | 232 ++++++++++++++---------------- src/app/docs/DocsLayoutClient.tsx | 34 ++++- 2 files changed, 137 insertions(+), 129 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index 8b4a01f..3ad840f 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,777 +2,763 @@ https://kagent.dev/agents - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/blog - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/community - 2026-03-12 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/concepts/agent-memory - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agents - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/concepts/architecture - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/concepts - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/concepts/tools - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-agents - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-byo - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/agents-mcp - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/crewai-byo - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/discord-a2a - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/documentation - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/human-in-the-loop - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/langchain-byo - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/skills - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/examples/slack-a2a - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-mcp-tool - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/local-development - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/quickstart - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/system-prompts - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/introduction/installation - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/introduction - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/introduction/what-is-kagent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/observability/audit-prompts - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/observability/launch-ui - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/observability - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/observability/tracing - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/operations/debug - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/operations/operational-considerations - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/operations - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/operations/uninstall - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/operations/upgrade - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/api-ref - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-build - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-completion - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-deploy - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-get - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-help - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-init - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-install - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-invoke - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-mcp - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-run - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-version - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/faq - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/helm - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/resources/release-notes - 2026-03-12 - weekly - 0.8 - - - - https://kagent.dev/docs/kagent/resources/tools-ecosystem - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/anthropic - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/azure-openai - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/byo-openai - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/gemini - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/google-vertexai - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/ollama - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/openai - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/install-controller - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/deploy - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/server - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/develop/fastmcp-python - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/develop/mcp-go - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/develop - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/introduction - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/quickstart - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/api-ref - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-add-tool - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-build - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-completion - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-deploy - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-help - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-init - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-install - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-run - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-secrets - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/reference - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs/kmcp/secrets - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/docs - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/enterprise - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/page.tsx - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/argo-rollouts-conversion-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/cilium-crd-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/helm-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/istio-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/k8s-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/kgateway-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/observability-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/agents/promql-agent - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/istio - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/kubernetes - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/prometheus - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/documentation - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/helm - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/argo - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/grafana - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/other - 2026-03-12 + 2026-03-13 weekly 0.8 https://kagent.dev/tools/cilium - 2026-03-12 + 2026-03-13 weekly 0.8 diff --git a/src/app/docs/DocsLayoutClient.tsx b/src/app/docs/DocsLayoutClient.tsx index 87683e2..2f2835f 100644 --- a/src/app/docs/DocsLayoutClient.tsx +++ b/src/app/docs/DocsLayoutClient.tsx @@ -1,5 +1,5 @@ 'use client' -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { Button } from "@/components/ui/button"; @@ -21,14 +21,32 @@ interface DocsLayoutClientProps { } export default function DocsLayoutClient({ navigation, children }: DocsLayoutClientProps) { + const pathname = usePathname(); - function initializeExpandedSections(navigation: NavItem[]): { [key: string]: boolean } { + function initializeExpandedSections(navigation: NavItem[], currentPath: string): { [key: string]: boolean } { const initial: { [key: string]: boolean } = {}; + + // Helper function to check if path matches + const isActiveItem = (href: string) => currentPath === href || currentPath.startsWith(href + '/'); + + // Helper function to check if section contains active item + const containsActiveItem = (items?: NavItem[]): boolean => { + if (!items) return false; + return items.some(item => { + if (isActiveItem(item.href)) return true; + if (item.items) return containsActiveItem(item.items); + return false; + }); + }; + navigation.forEach(section => { - initial[section.title] = false; + // Expand section if it or its children contain the active page + initial[section.title] = isActiveItem(section.href) || containsActiveItem(section.items); + section.items?.forEach(item => { if (item.items && item.items.length > 0) { - initial[item.title] = false; + // Expand subsection if it or its children contain the active page + initial[item.title] = isActiveItem(item.href) || containsActiveItem(item.items); } }); }); @@ -36,11 +54,15 @@ export default function DocsLayoutClient({ navigation, children }: DocsLayoutCli } const [sidebarOpen, setSidebarOpen] = useState(false); - const pathname = usePathname(); const [expandedSections, setExpandedSections] = useState<{ [key: string]: boolean }>(() => - initializeExpandedSections(navigation) + initializeExpandedSections(navigation, pathname) ); + // Update expanded sections when pathname changes + useEffect(() => { + setExpandedSections(initializeExpandedSections(navigation, pathname)); + }, [pathname, navigation]); + const toggleSidebar = () => { setSidebarOpen(!sidebarOpen); }; From 17fd08c0b8b127ccb7798fe5c3c771fcdaf78cc7 Mon Sep 17 00:00:00 2001 From: Yaniv Marom Nachumi Date: Sun, 15 Mar 2026 14:06:42 +0200 Subject: [PATCH 24/27] Add yanivmn as co-author Signed-off-by: Yaniv Marom Nachumi Signed-off-by: Art Berger --- public/images/authors/yanivmn.jpg | Bin 0 -> 44678 bytes src/app/blog/authors.ts | 7 +++++++ src/blogContent/go-vs-python-runtime.mdx | 10 +++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 public/images/authors/yanivmn.jpg diff --git a/public/images/authors/yanivmn.jpg b/public/images/authors/yanivmn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39a4c5bc1ede0ab0cd54c16d7776881401033bfa GIT binary patch literal 44678 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�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 literal 0 HcmV?d00001 diff --git a/src/app/blog/authors.ts b/src/app/blog/authors.ts index 185560c..ccac204 100644 --- a/src/app/blog/authors.ts +++ b/src/app/blog/authors.ts @@ -56,6 +56,13 @@ export const authors: Author[] = [ photo: "/images/authors/eitan_yarmush.jpeg", bio: "Professional tinkerer and problem solver", }, + { + id: "yanivmn", + name: "Yaniv Marom-Nachumi", + title: "Solutions Architect @ Amdocs", + photo: "/images/authors/yanivmn.jpg", + bio: "Passionate about cloud-native technologies and Kubernetes.", + }, ]; export const getAuthorById = (id: string): Author | undefined => { diff --git a/src/blogContent/go-vs-python-runtime.mdx b/src/blogContent/go-vs-python-runtime.mdx index 735a351..af429f2 100644 --- a/src/blogContent/go-vs-python-runtime.mdx +++ b/src/blogContent/go-vs-python-runtime.mdx @@ -3,7 +3,7 @@ export const metadata = { publishDate: "2026-03-12T00:00:00Z", description: "We benchmarked kagent's Go and Python agent runtimes on image size, startup time, and memory. The results: 11x smaller images, 6.7x faster startup, and 36x less memory.", author: "Eitan Yarmush", - authorIds: ["eitanya"], + authorIds: ["eitanya", "yanivmn"], } # We Added a Go Runtime to kagent and the Numbers Are Wild @@ -50,6 +50,14 @@ This is the one that really matters at scale. A compiled Go binary with no GC pr Think about what this means for a real deployment: 20 agents on Python would consume **~5 GB** just in runtime overhead before processing a single request. The same 20 agents on Go? About **140 Mi**. That's the difference between needing a dedicated node pool and fitting comfortably on existing infrastructure. +### Security Surface: Minimal Attack Vectors + +The Go runtime's minimal footprint isn't just about performance — it's a security win too. + +The distroless base image has no shell, no package manager, no unnecessary utilities. There's literally nothing for an attacker to exploit if they somehow get code execution. Compare that to a Python image with pip, a full interpreter, and hundreds of transitive dependencies — each one a potential CVE waiting to happen. + +Fewer dependencies also means fewer supply chain risks. The Go binary has exactly the dependencies it needs compiled in, with no runtime package resolution. No `requirements.txt` to poison, no pip installs happening at startup. For security-conscious deployments (and in Kubernetes, that should be all of them), this matters. + ## So Should You Ditch Python? Not necessarily! The two runtimes serve different use cases: From 334b149c0bffbe9ebacbc1941b3853ad4366e7a7 Mon Sep 17 00:00:00 2001 From: Yaniv Marom Nachumi Date: Sun, 15 Mar 2026 14:09:46 +0200 Subject: [PATCH 25/27] Add yanivmn as co-author Signed-off-by: Yaniv Marom Nachumi Signed-off-by: Art Berger --- public/sitemap.xml | 218 ++++++++++++++++++++++----------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index 3ad840f..719d058 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,763 +2,763 @@ https://kagent.dev/agents - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/blog - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/community - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agents - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/concepts/architecture - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/concepts - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/concepts/tools - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-agents - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-byo - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/agents-mcp - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/crewai-byo - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/discord-a2a - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/documentation - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/human-in-the-loop - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/langchain-byo - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/skills - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/examples/slack-a2a - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-mcp-tool - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/local-development - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/quickstart - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/system-prompts - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/introduction/installation - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/introduction - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/introduction/what-is-kagent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/observability/audit-prompts - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/observability/launch-ui - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/observability - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/observability/tracing - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/operations/debug - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/operations/operational-considerations - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/operations - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/operations/uninstall - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/operations/upgrade - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/api-ref - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-build - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-completion - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-deploy - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-get - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-help - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-init - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-install - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-invoke - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-mcp - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-run - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-version - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/faq - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/helm - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/resources/release-notes - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/anthropic - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/azure-openai - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/byo-openai - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/gemini - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/google-vertexai - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/ollama - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/openai - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/install-controller - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/deploy - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/server - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/develop/fastmcp-python - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/develop/mcp-go - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/develop - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/introduction - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/quickstart - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/api-ref - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-add-tool - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-build - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-completion - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-deploy - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-help - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-init - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-install - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-run - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-secrets - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/reference - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs/kmcp/secrets - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/docs - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/enterprise - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/page.tsx - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/argo-rollouts-conversion-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/cilium-crd-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/helm-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/istio-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/k8s-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/kgateway-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/observability-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/agents/promql-agent - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/istio - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/kubernetes - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/prometheus - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/documentation - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/helm - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/argo - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/grafana - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/other - 2026-03-13 + 2026-03-15 weekly 0.8 https://kagent.dev/tools/cilium - 2026-03-13 + 2026-03-15 weekly 0.8 From 09229253a832b011f345a54c5cb4818610012e34 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 18 Mar 2026 13:47:43 -0400 Subject: [PATCH 26/27] dco test Signed-off-by: Art Berger From 448a1517e294922cfa8fcb74818514df38b05610 Mon Sep 17 00:00:00 2001 From: Art Berger Date: Wed, 18 Mar 2026 14:02:46 -0400 Subject: [PATCH 27/27] fix links Signed-off-by: Art Berger --- public/sitemap.xml | 232 ++++++++++++++------------ src/app/docs/kagent/concepts/page.mdx | 10 +- src/app/docs/kagent/examples/page.mdx | 1 + 3 files changed, 129 insertions(+), 114 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index 719d058..cffb7e2 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,763 +2,777 @@ https://kagent.dev/agents - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/blog - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/community - 2026-03-15 + 2026-03-18 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/concepts/agent-memory + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/concepts/agents - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/concepts/architecture - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/concepts - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/concepts/tools - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-agents - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/a2a-byo - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/agents-mcp - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/crewai-byo - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/discord-a2a - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/documentation - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/human-in-the-loop - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/langchain-byo - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/skills - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/examples/slack-a2a - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/first-mcp-tool - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/local-development - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/quickstart - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/getting-started/system-prompts - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/introduction/installation - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/introduction - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/introduction/what-is-kagent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/observability/audit-prompts - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/observability/launch-ui - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/observability - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/observability/tracing - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/operations/debug - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/operations/operational-considerations - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/operations - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/operations/uninstall - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/operations/upgrade - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/api-ref - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-add-mcp - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-bug-report - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-build - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-completion - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-dashboard - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-deploy - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-get - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-help - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-init - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-install - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-invoke - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-mcp - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-run - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-uninstall - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli/kagent-version - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/cli - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/faq - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/helm - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/resources/release-notes - 2026-03-15 + 2026-03-18 + weekly + 0.8 + + + + https://kagent.dev/docs/kagent/resources/tools-ecosystem + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/amazon-bedrock - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/anthropic - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/azure-openai - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/byo-openai - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/gemini - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/google-vertexai - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/ollama - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers/openai - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kagent/supported-providers - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/install-controller - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/deploy - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/deploy/server - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/develop/fastmcp-python - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/develop/mcp-go - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/develop - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/introduction - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/quickstart - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/api-ref - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-add-tool - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-build - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-completion - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-deploy - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-help - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-init - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-install - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-run - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference/kmcp-secrets - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/reference - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs/kmcp/secrets - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/docs - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/enterprise - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/page.tsx - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/argo-rollouts-conversion-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/cilium-crd-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/helm-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/istio-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/k8s-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/kgateway-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/observability-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/agents/promql-agent - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/istio - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/kubernetes - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/prometheus - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/documentation - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/helm - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/argo - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/grafana - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/other - 2026-03-15 + 2026-03-18 weekly 0.8 https://kagent.dev/tools/cilium - 2026-03-15 + 2026-03-18 weekly 0.8 diff --git a/src/app/docs/kagent/concepts/page.mdx b/src/app/docs/kagent/concepts/page.mdx index c908964..2130949 100644 --- a/src/app/docs/kagent/concepts/page.mdx +++ b/src/app/docs/kagent/concepts/page.mdx @@ -25,11 +25,11 @@ import QuickLink from '@/components/quick-link'; - + - - - - + + + + diff --git a/src/app/docs/kagent/examples/page.mdx b/src/app/docs/kagent/examples/page.mdx index ce39f50..f6367fe 100644 --- a/src/app/docs/kagent/examples/page.mdx +++ b/src/app/docs/kagent/examples/page.mdx @@ -28,5 +28,6 @@ import QuickLink from '@/components/quick-link'; +