AI Action
AI Action allows you to integrate AI capabilities into your playbooks by leveraging the rich context that Mission Control maintains about your infrastructure. When executed against configs or components, the AI action automatically injects:
- Component/config manifests and specifications
- Related configurations with configurable relationship depth
- Historical analysis data within the specified time period
- Change history across related infrastructure within defined time ranges
This comprehensive context enables AI models to provide more informed analysis and insights about your infrastructure state and relationships. For example, when a Kubernetes pod fails, it examines the pod spec, ConfigMap changes, service logs together, revealing patterns that single-component analysis might overlook.
diagnose-kubernetes-resource.yaml---
# yaml-language-server: $schema=../../config/schemas/playbook.schema.json
apiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
name: diagnose-kubernetes-resource
spec:
description: Use AI to diagnose unhealthy kubernetes resources
configs:
- types:
- Kubernetes::DaemonSet
- Kubernetes::Deployment
- Kubernetes::Pod
- Kubernetes::StatefulSet
parameters:
- name: prompt
label: Prompt
default: Find out why {{.config.name}} is unhealthy
properties:
multiline: 'true'
actions:
- name: query
ai:
connection: connection://mc/anthropic
systemPrompt: |
**Role:** Seasoned Kubernetes engineer and Diagnostic Expert
**Objective:** Assist users in diagnosing issues with unhealthy Kubernetes resources by analyzing provided manifests and related resources.
**Instructions:**
1. **Resource Analysis:** Examine the manifest of the unhealthy resource thoroughly.
2. **Contextual Investigation:** Consider additional related resources provided (e.g., pods, replica sets, namespaces) to gain a comprehensive understanding of the issue.
3. **Diagnostic Steps:** Clearly outline the steps taken during the investigation, focusing on precision and brevity.
4. **One-Time Diagnosis:** Aim to diagnose the issue in a single response without requiring follow-up questions.
**Output:** Provide a concise diagnosis and potential solutions based on the analysis.
prompt: '{{.params.prompt}}'
changes:
since: 2d
analysis:
since: 2d
relationships:
- depth: 3
direction: outgoing
changes:
since: 24h
- depth: 5
direction: incoming
changes:
since: 24h
Field | Description | Scheme |
---|---|---|
name* | Step Name |
|
prompt* | Main prompt |
|
systemPrompt* | Context-setting system prompt |
|
analysis.since | Select the analysis of the playbook resource to feed into the AI | |
apiKey | AI service API key | |
apiURL | Custom API endpoint (applicable when behind a proxy or using Ollama) |
|
backend | LLM provider | |
changes.since | Select the changes of the playbook resource to feed into the AI | |
connection | Connection string for the LLM |
|
formats | Output format. (Only | |
model | LLM model (e.g. gpt-4) |
|
relationships | Select the related configs and their changes and analysis to feed into the AI | |
delay | A delay before running the action e.g. | |
filter | Conditionally run an action | |
runsOn | Which runner (agent) to run the action on | |
templatesOn | Where templating (and secret management) of actions should occur | |
timeout | Timeout on this action. |
Relationship
The AI Action can maintain relationships with other elements:
Field | Description | Scheme |
---|---|---|
analysis.since | Select the analysis of the related resources to feed into the AI | |
changes.since | Select the changes of the related resources to feed into the AI | |
depth | Depth of the relationship |
|
direction | Direction of the relationship |
Templating
CEL Expressions
The following variables can be used within the CEL expressions of filter
, if
, delays
and parameters.default
:
Field | Description | Schema |
---|---|---|
config | Config passed to the playbook | ConfigItem |
component | Component passed to the playbook | Component |
check | Canary Check passed to the playbook | Check |
playbook | Playbook passed to the playbook | Playbook |
run | Current run | Run |
params | User provided parameters to the playbook | map[string]any |
request | Webhook request | Webhook Request |
env | Environment variables defined on the playbook | map[string]any |
user.name | Name of the user who invoked the action | string |
user.email | Email of the user who invoked the action | string |
agent.id | ID of the agent the resource belongs to. | string |
agent.name | Name of the agent the resource belongs to. | string |
Conditionally Running Actions
Playbook actions can be selectively executed based on CEL expressions. These expressions must either return
- a boolean value (
true
indicating run the action & skip the action otherwise) - or a special function among the ones listed below
Function | Description |
---|---|
always() | run no matter what; even if the playbook is cancelled/fails |
failure() | run if any of the previous actions failed |
skip() | skip running this action |
success() | run only if all previous actions succeeded (default) |
timeout() | run only if any of the previous actions timed out |
delete-kubernetes-pod.yaml---
apiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
name: notify-send-with-filter
spec:
parameters:
- name: message
label: The message for notification
default: '{{.config.name}}'
configs:
- types:
- Kubernetes::Pod
actions:
- name: Send notification
exec:
script: notify-send "{{.config.name}} was created"
- name: Bad script
exec:
script: deltaforce
- name: Send all success notification
if: success() # this filter practically skips this action as the second action above always fails
exec:
script: notify-send "Everything went successfully"
- name: Send notification regardless
if: always()
exec:
script: notify-send "a Pod config was created"
Defaulting Parameters
delete-kubernetes-pod.yamlapiVersion:
mission-control.flanksource.com/v1
kind: Playbook
metadata:
name: edit
spec:
title: 'Edit Kustomize Resource'
icon: flux
parameters:
- default: 'chore: update $(.config.type)/$(.config.name)'
name: commit_message
Go Templating
When templating actions
with Go Templates, the context variables are available as fields of the template's context object .
eg .config
, .user.email
Templating Actions
delete-kubernetes-pod.yamlapiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
name: scale-deployment
spec:
description: Scale Deployment
configs:
- types:
- Kubernetes::Deployment
parameters:
- name: replicas
label: The new desired number of replicas.
actions:
- name: kubectl scale
exec:
script: |
kubectl scale --replicas={{.params.replicas}} \
--namespace={{.config.tags.namespace}} \
deployment {{.config.name}}
Functions
Function | Description | Return |
---|---|---|
getLastAction() | Returns the result of the action that just run | Action Specific |
getAction({action}) | Return the result of a specific action | Action Specific |
Reusing Action Results
action-results.yamlapiVersion: mission-control.flanksource.com/v1
kind: Playbook
metadata:
name: use-previous-action-result
spec:
description: Creates a file with the content of the config
configs:
- types:
- Kubernetes::Pod
actions:
- name: Fetch all changes
sql:
query: SELECT id FROM config_changes WHERE config_id = '{{.config.id}}'
driver: postgres
connection: connection://postgres/local
- name: Send notification
if: 'last_result().count > 0'
notification:
title: 'Changes summary for {{.config.name}}'
connection: connection://slack/flanksource
message: |
{{$rows:=index last_result "count"}}
Found {{$rows}} changes