Skip to content

refactor(ai): move ai namespace to base + main overlay - #1428

Merged
Aviator-Coding merged 2 commits into
mainfrom
fm/homeops-split-ns-lane3-s13
Aug 24, 2026
Merged

refactor(ai): move ai namespace to base + main overlay#1428
Aviator-Coding merged 2 commits into
mainfrom
fm/homeops-split-ns-lane3-s13

Conversation

@Aviator-Coding

Copy link
Copy Markdown
Owner

Intent

Execute lane 3 of the home-ops flux/ -> kubernetes/clusters/main structural split, as SERIAL gated PRs, one stage per PR, in order S12 downloads (merged as PR #1425 and confirmed converged live), S13 ai, S14 monitoring. This is stage S13: move the ai namespace from the flat kubernetes/apps/ai layout to the base + kubernetes/apps/main/ai overlay shape established by the already-merged skeleton. Used migrate-ns.py (from the re-proved procedure in the round-2 refactor scout report, Q4 + appendix) to perform a deterministic, pure-rename move: kubernetes/apps/ai//ks.yaml -> kubernetes/apps/main/ai/.yaml, kubernetes/apps/ai/kustomization.yaml -> kubernetes/apps/main/ai/kustomization.yaml, everything else -> kubernetes/apps/base/ai/..., plus the four line-level path/components rewrites the script performs and dropping/adding the namespace from apps/kustomization.yaml and apps/main/kustomization.yaml. No YAML semantics beyond those mechanical rewrites should change. Gate proof performed before committing: flux-local build of kubernetes/clusters/main renders byte-identical leaf workload docs before/after (1763 leaf docs, empty diff) and byte-identical normalized Flux Kustomization CRs (116 unique Kustomizations, empty diff after normalizing away only the base/ path prefix and components depth changes); flux-local test --all-namespaces passed 118/118. This stage must not touch monitoring or any other namespace - monitoring (S14) is the next and final stage in this lane, gated on this PR merging first.

What Changed

  • Relocated the ai namespace from the flat kubernetes/apps/ai layout into kubernetes/apps/base/ai (manifests) and kubernetes/apps/main/ai (Flux Kustomizations), with mechanical spec.path / components depth rewrites only.
  • Dropped ./ai from the inert kubernetes/apps/kustomization.yaml list and pointed the live kubernetes/apps/main entry at ./ai.
  • Updated docs, AGENTS.md, and the Grafana agentgateway dashboard comment to the new base/main paths.

Risk Assessment

✅ Low: Pure mechanical rename/move of the ai namespace into base+main overlay shape; every non-100%-similarity file was individually verified to contain only the expected path/components rewrites with correct relative-depth arithmetic, no other namespace or semantics changed, and the top-level kustomization.yaml edits correctly drop/add the ai entry in place.

Testing

Targeted flux-local validation confirms the ai-namespace migration is a byte-identical mechanical rename: flux-local test --all-namespaces passed 118/118 on the target commit, and a full rendered-manifest diff between base and target commits across all 116 Kustomizations showed zero unexpected changes, only the two documented path/components rewrites, with no other namespace touched.

Evidence: flux-local test --all-namespaces --path kubernetes/clusters/main (target commit)
118 passed in 6.47s — all Kustomizations including ai/* (agentgateway, agentgateway-dashboards, agentmemory, comfyui, hermes, searxng, toolhive, toolhive-crds, vllm) PASSED
Evidence: Full-cluster rendered-manifest diff, base fe20338 vs target f555c97 (kustomize build via flux-local build kustomizations --all-namespaces, 61147 lines each side)
diff shows exactly 15 hunks / 60 lines total, across the whole 116-Kustomization / 61147-line cluster render — every single line is either a `path: ./kubernetes/apps/ai/...` -> `path: ./kubernetes/apps/base/ai/...` rewrite or a components relative-depth `../` addition for ai/agentgateway-dashboards, ai/comfyui, ai/hermes. Zero other lines differ anywhere in the cluster.

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • flux-local test --all-namespaces --path kubernetes/clusters/main --verbose on target commit f555c97e (118 passed)
  • git diff --stat fe203388...f555c97e to confirm only kubernetes/apps/ai/, kubernetes/apps/base/ai/, kubernetes/apps/main/ai/**, kubernetes/apps/kustomization.yaml, kubernetes/apps/main/kustomization.yaml were touched
  • flux-local build kustomizations --path kubernetes/clusters/main --all-namespaces rendered independently against a temporary worktree at base commit fe203388 and against the target worktree, then diffed byte-for-byte (61147 lines each; 15-hunk/60-line diff, all mechanical path/components rewrites)
  • Manual inspection of kubernetes/apps/main/ai/hermes.yaml (target) vs kubernetes/apps/ai/hermes/ks.yaml (base) confirming only the path: and components: lines changed
  • grep -c '^kind: Kustomization$' on both rendered outputs confirming 116 Kustomization objects in both base and target trees
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Pure rename via migrate-ns.py, part of the flux/ -> clusters/main
structural split (S13). flux-local build renders byte-identical leaf
docs and normalized Kustomizations before/after; flux-local test
--all-namespaces passes 118/118.
@Aviator-Coding
Aviator-Coding force-pushed the fm/homeops-split-ns-lane3-s13 branch from 0263598 to 7bb8ccf Compare August 24, 2026 02:19
@mortyops

mortyops Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor
--- kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds HelmRelease: ai/agentgateway-crds

+++ kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds HelmRelease: ai/agentgateway-crds

@@ -1,56 +0,0 @@

----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway-crds
-    kustomize.toolkit.fluxcd.io/name: agentgateway-crds
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: agentgateway-crds
-  namespace: ai
-spec:
-  chartRef:
-    kind: OCIRepository
-    name: agentgateway-crds
-  driftDetection:
-    mode: enabled
-  install:
-    crds: CreateReplace
-    createNamespace: true
-    replace: true
-    strategy:
-      name: RetryOnFailure
-      retryInterval: 5m
-    timeout: 10m
-  interval: 1h
-  maxHistory: 3
-  postRenderers:
-  - kustomize:
-      patches:
-      - patch: |-
-          apiVersion: apiextensions.k8s.io/v1
-          kind: CustomResourceDefinition
-          metadata:
-            name: _
-            annotations:
-              helm.sh/resource-policy: keep
-        target:
-          kind: CustomResourceDefinition
-  rollback:
-    cleanupOnFail: true
-    force: true
-    recreate: true
-  test:
-    enable: true
-  uninstall:
-    keepHistory: false
-  upgrade:
-    cleanupOnFail: true
-    crds: CreateReplace
-    remediation:
-      remediateLastFailure: true
-      retries: 2
-      strategy: rollback
-    strategy:
-      name: RemediateOnFailure
-
--- kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds OCIRepository: ai/agentgateway-crds

+++ kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds OCIRepository: ai/agentgateway-crds

@@ -1,19 +0,0 @@

----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway-crds
-    kustomize.toolkit.fluxcd.io/name: agentgateway-crds
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: agentgateway-crds
-  namespace: ai
-spec:
-  interval: 5m
-  layerSelector:
-    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
-    operation: copy
-  ref:
-    tag: v1.4.1
-  url: oci://cr.agentgateway.dev/charts/agentgateway-crds
-
--- kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds OCIRepository: ai/toolhive-operator-crds

+++ kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds OCIRepository: ai/toolhive-operator-crds

@@ -1,19 +0,0 @@

----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-crds
-    kustomize.toolkit.fluxcd.io/name: toolhive-crds
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: toolhive-operator-crds
-  namespace: ai
-spec:
-  interval: 15m
-  layerSelector:
-    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
-    operation: copy
-  ref:
-    tag: 0.42.0
-  url: oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds
-
--- kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds HelmRelease: ai/toolhive-operator-crds

+++ kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds HelmRelease: ai/toolhive-operator-crds

@@ -1,31 +0,0 @@

----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-crds
-    kustomize.toolkit.fluxcd.io/name: toolhive-crds
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: toolhive-operator-crds
-  namespace: ai
-spec:
-  chartRef:
-    kind: OCIRepository
-    name: toolhive-operator-crds
-  install:
-    crds: CreateReplace
-    strategy:
-      name: RetryOnFailure
-  interval: 30m
-  rollback:
-    cleanupOnFail: true
-    recreate: true
-  upgrade:
-    cleanupOnFail: true
-    crds: CreateReplace
-    remediation:
-      remediateLastFailure: true
-      retries: 2
-    strategy:
-      name: RemediateOnFailure
-
--- kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/agentgateway-dashboard

+++ kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/agentgateway-dashboard

@@ -1,1213 +0,0 @@

----
-apiVersion: v1
-data:
-  agentgateway.json: |
-    {
-      "annotations": {},
-      "editable": true,
-      "fiscalYearStartMonth": 0,
-      "graphTooltip": 1,
-      "links": [
-        {
-          "title": "LLM Cost",
-          "type": "link",
-          "url": "/d/ai-llm-cost"
-        }
-      ],
-      "panels": [
-        {
-          "collapsed": false,
-          "gridPos": {
-            "h": 1,
-            "w": 24,
-            "x": 0,
-            "y": 0
-          },
-          "id": 0,
-          "panels": [],
-          "title": "Overview",
-          "type": "row"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              },
-              "unit": "bytes"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 0,
-            "y": 1
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
-            }
-          },
-          "repeatDirection": "h",
-          "targets": [
-            {
-              "expr": "sum by (pod,namespace) (container_memory_working_set_bytes{image=\"\",namespace=~\"$namespace\"}) * on(pod, namespace) group_left(gateway_networking_k8s_io_gateway_name) group by (pod,namespace,gateway_networking_k8s_io_gateway_name) (agentgateway_build_info{namespace=~\"$namespace\",gateway_networking_k8s_io_gateway_name=~\"$gateway_name\"})",
-              "legendFormat": "{{namespace}}/{{pod}}",
-              "refId": ""
-            }
-          ],
-          "title": "Memory",
-          "transformations": [],
-          "transparent": false,
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              }
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 12,
-            "y": 1
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
-            }
-          },
-          "repeatDirection": "h",
-          "targets": [
-            {
-              "expr": "sum by (pod,namespace) (irate(container_cpu_usage_seconds_total{image=\"\",namespace=~\"$namespace\"}[$__rate_interval]) * on(pod, namespace) group_left(gateway_networking_k8s_io_gateway_name) group by (pod,namespace,gateway_networking_k8s_io_gateway_name) (agentgateway_build_info{namespace=~\"$namespace\",gateway_networking_k8s_io_gateway_name=~\"$gateway_name\"}))",
-              "legendFormat": "{{namespace}}/{{pod}}",
-              "refId": ""
-            }
-          ],
-          "title": "CPU",
-          "transformations": [],
-          "transparent": false,
-          "type": "timeseries"
-        },
-        {
-          "collapsed": false,
-          "gridPos": {
-            "h": 1,
-            "w": 24,
-            "x": 0,
-            "y": 11
-          },
-          "id": 0,
-          "panels": [],
-          "title": "Requests",
-          "type": "row"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              },
-              "unit": "reqps"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 0,
-            "y": 12
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
-            }
-          },
-          "repeatDirection": "h",
-          "targets": [
-            {
-              "expr": "sum by (pod,namespace) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
-              "legendFormat": "{{namespace}}/{{pod}}",
-              "refId": ""
-            }
-          ],
-          "title": "Requests (by Pod)",
-          "transformations": [],
-          "transparent": false,
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              },
-              "unit": "reqps"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 12,
-            "y": 12
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
-            }
-          },
-          "repeatDirection": "h",
-          "targets": [
-            {
-              "expr": "sum by (gateway) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
-              "legendFormat": "{{gateway}}",
-              "refId": ""
-            }
-          ],
-          "title": "Requests (by Gateway)",
-          "transformations": [],
-          "transparent": false,
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              },
-              "unit": "reqps"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 0,
-            "y": 22
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
-            }
-          },
-          "repeatDirection": "h",
-          "targets": [
-            {
-              "expr": "sum by (gateway,status) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
-              "legendFormat": "{{gateway}}: {{status}}",
-              "refId": ""
-            }
-          ],
-          "title": "Requests (by Status)",
-          "transformations": [],
-          "transparent": false,
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "$datasource"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "custom": {
-                "fillOpacity": 10,
-                "gradientMode": "opacity",
-                "showPoints": "never"
-              },
-              "unit": "reqps"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 10,
-            "w": 12,
-            "x": 12,
-            "y": 22
-          },
-          "interval": "5s",
-          "options": {
-            "legend": {
-              "calcs": [
-                "last",
-                "max",
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "bottom",
-              "showLegend": true,
-              "sortBy": "Last",
-              "sortDesc": true
-            },
-            "tooltip": {
-              "mode": "single",
-              "sort": "asc"
[Diff truncated by flux-local]
--- kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/llm-cost-dashboard

+++ kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/llm-cost-dashboard

@@ -1,251 +0,0 @@

----
-apiVersion: v1
-data:
-  llm-cost.json: |
-    {
-      "annotations": {
-        "list": []
-      },
-      "editable": true,
-      "graphTooltip": 1,
-      "id": null,
-      "links": [
-        {
-          "title": "Agentgateway",
-          "type": "link",
-          "url": "/d/agentgateway"
-        }
-      ],
-      "panels": [
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "prometheus"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "unit": "currencyUSD",
-              "custom": {
-                "drawStyle": "line",
-                "fillOpacity": 15,
-                "lineWidth": 2,
-                "showPoints": "never"
-              }
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 9,
-            "w": 16,
-            "x": 0,
-            "y": 0
-          },
-          "id": 1,
-          "options": {
-            "legend": {
-              "calcs": [
-                "sum"
-              ],
-              "displayMode": "table",
-              "placement": "right",
-              "showLegend": true
-            },
-            "tooltip": {
-              "mode": "multi",
-              "sort": "desc"
-            }
-          },
-          "targets": [
-            {
-              "datasource": {
-                "type": "prometheus",
-                "uid": "prometheus"
-              },
-              "expr": "ai:gen_ai_cost_usd:rate5m * 3600",
-              "legendFormat": "{{gen_ai_request_model}}",
-              "refId": "A"
-            }
-          ],
-          "title": "Estimated cost rate ($/hour) by model",
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "prometheus"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "unit": "currencyUSD",
-              "decimals": 2
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 9,
-            "w": 8,
-            "x": 16,
-            "y": 0
-          },
-          "id": 2,
-          "options": {
-            "reduceOptions": {
-              "calcs": [
-                "lastNotNull"
-              ],
-              "fields": "",
-              "values": false
-            },
-            "textMode": "auto",
-            "colorMode": "value",
-            "graphMode": "area"
-          },
-          "targets": [
-            {
-              "datasource": {
-                "type": "prometheus",
-                "uid": "prometheus"
-              },
-              "expr": "sum(sum by (gen_ai_request_model, gen_ai_token_type) (increase(agentgateway_gen_ai_client_token_usage_sum[$__range])) * on (gen_ai_request_model, gen_ai_token_type) group_left () ai:llm_token_price_per_million_usd) / 1e6",
-              "legendFormat": "spend",
-              "refId": "A"
-            }
-          ],
-          "title": "Estimated spend (dashboard time range)",
-          "type": "stat"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "prometheus"
-          },
-          "fieldConfig": {
-            "defaults": {
-              "unit": "cps",
-              "custom": {
-                "drawStyle": "bars",
-                "fillOpacity": 60,
-                "stacking": {
-                  "mode": "normal"
-                }
-              }
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 9,
-            "w": 16,
-            "x": 0,
-            "y": 9
-          },
-          "id": 3,
-          "options": {
-            "legend": {
-              "calcs": [
-                "mean"
-              ],
-              "displayMode": "table",
-              "placement": "right",
-              "showLegend": true
-            },
-            "tooltip": {
-              "mode": "multi",
-              "sort": "desc"
-            }
-          },
-          "targets": [
-            {
-              "datasource": {
-                "type": "prometheus",
-                "uid": "prometheus"
-              },
-              "expr": "ai:gen_ai_tokens:rate5m",
-              "legendFormat": "{{gen_ai_request_model}} ({{gen_ai_token_type}})",
-              "refId": "A"
-            }
-          ],
-          "title": "Token rate by model (tokens/s)",
-          "type": "timeseries"
-        },
-        {
-          "datasource": {
-            "type": "prometheus",
-            "uid": "prometheus"
-          },
-          "description": "Models consuming tokens that have NO row in the price table (kubernetes/apps/ai/agentgateway/app/rules/cost.yaml). Keep this panel empty.",
-          "fieldConfig": {
-            "defaults": {
-              "unit": "cps"
-            },
-            "overrides": []
-          },
-          "gridPos": {
-            "h": 9,
-            "w": 8,
-            "x": 16,
-            "y": 9
-          },
-          "id": 4,
-          "options": {
-            "legend": {
-              "calcs": [],
-              "displayMode": "list",
-              "placement": "bottom",
-              "showLegend": true
-            },
-            "tooltip": {
-              "mode": "multi",
-              "sort": "desc"
-            }
-          },
-          "targets": [
-            {
-              "datasource": {
-                "type": "prometheus",
-                "uid": "prometheus"
-              },
-              "expr": "ai:gen_ai_tokens_unpriced:rate5m",
-              "legendFormat": "{{gen_ai_request_model}} ({{gen_ai_token_type}})",
-              "refId": "A"
-            }
-          ],
-          "title": "Unpriced models (should be empty)",
-          "type": "timeseries"
-        }
-      ],
-      "refresh": "1m",
-      "schemaVersion": 39,
-      "tags": [
-        "ai",
-        "llm",
-        "cost"
-      ],
-      "templating": {
-        "list": []
-      },
-      "time": {
-        "from": "now-24h",
-        "to": "now"
-      },
-      "timezone": "browser",
-      "title": "LLM Cost",
-      "uid": "ai-llm-cost",
-      "version": 1
-    }
-kind: ConfigMap
-metadata:
-  annotations:
-    config.kubernetes.io/origin: |
-      configuredIn: kustomization.yaml
-      configuredBy:
-        apiVersion: builtin
-        kind: ConfigMapGenerator
-    grafana_folder: AI/ML
-  labels:
-    app.kubernetes.io/name: agentgateway-dashboards
-    grafana_dashboard: 'true'
-    kustomize.toolkit.fluxcd.io/name: agentgateway-dashboards
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: llm-cost-dashboard
-  namespace: ai
-
--- kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui PersistentVolumeClaim: ai/comfyui-output

+++ kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui PersistentVolumeClaim: ai/comfyui-output

@@ -1,18 +0,0 @@

----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  labels:
-    app.kubernetes.io/name: comfyui
-    kustomize.toolkit.fluxcd.io/name: comfyui
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: comfyui-output
-  namespace: ai
-spec:
-  accessModes:
-  - ReadWriteMany
-  resources:
-    requests:
-      storage: 25Gi
-  storageClassName: ceph-filesystem-rwx
-
--- kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui HelmRelease: ai/comfyui

+++ kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui HelmRelease: ai/comfyui

@@ -1,178 +0,0 @@

----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
-  labels:
-    app.kubernetes.io/name: comfyui
-    kustomize.toolkit.fluxcd.io/name: comfyui
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: comfyui
-  namespace: ai
-spec:
-  chartRef:
-    kind: OCIRepository
-    name: app-template
-  install:
-    crds: CreateReplace
-    createNamespace: true
-    remediation:
-      retries: 3
-    strategy:
-      name: RetryOnFailure
-  interval: 1h
-  maxHistory: 2
-  rollback:
-    cleanupOnFail: true
-    recreate: true
-  suspend: true
-  timeout: 20m
-  uninstall:
-    keepHistory: false
-  upgrade:
-    cleanupOnFail: true
-    crds: CreateReplace
-    remediation:
-      remediateLastFailure: true
-      retries: 2
-    strategy:
-      name: RemediateOnFailure
-  values:
-    controllers:
-      comfyui:
-        containers:
-          app:
-            args:
-            - |
-              cd /llm/ComfyUI && exec python3 main.py --listen 0.0.0.0 --port 8188
-            command:
-            - /bin/bash
-            - -c
-            env:
-              ONEAPI_DEVICE_SELECTOR: level_zero:0
-              ZES_ENABLE_SYSMAN: '1'
-            image:
-              repository: intel/llm-scaler-omni
-              tag: 0.1.0-b7
-            probes:
-              liveness:
-                custom: true
-                enabled: true
-                spec:
-                  failureThreshold: 4
-                  periodSeconds: 15
-                  tcpSocket:
-                    port: 8188
-                  timeoutSeconds: 5
-              readiness:
-                custom: true
-                enabled: true
-                spec:
-                  failureThreshold: 4
-                  periodSeconds: 15
-                  tcpSocket:
-                    port: 8188
-                  timeoutSeconds: 5
-              startup:
-                custom: true
-                enabled: true
-                spec:
-                  failureThreshold: 60
-                  periodSeconds: 10
-                  tcpSocket:
-                    port: 8188
-                  timeoutSeconds: 5
-            resources:
-              limits:
-                gpu.intel.com/xe: 1
-                memory: 32Gi
-              requests:
-                cpu: '1'
-                gpu.intel.com/xe: 1
-                memory: 8Gi
-            securityContext:
-              allowPrivilegeEscalation: false
-              capabilities:
-                drop:
-                - ALL
-              readOnlyRootFilesystem: false
-        pod:
-          terminationGracePeriodSeconds: 60
-        replicas: 0
-        strategy: Recreate
-    persistence:
-      custom-nodes:
-        accessMode: ReadWriteOnce
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /llm/ComfyUI/custom_nodes
-        size: 10Gi
-        storageClass: ceph-block
-        type: persistentVolumeClaim
-      dshm:
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /dev/shm
-        medium: Memory
-        sizeLimit: 16Gi
-        type: emptyDir
-      input:
-        accessMode: ReadWriteOnce
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /llm/ComfyUI/input
-        size: 5Gi
-        storageClass: ceph-block
-        type: persistentVolumeClaim
-      models:
-        accessMode: ReadWriteOnce
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /llm/ComfyUI/models
-        size: 100Gi
-        storageClass: ceph-block
-        type: persistentVolumeClaim
-      output:
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /llm/ComfyUI/output
-        existingClaim: comfyui-output
-      user:
-        accessMode: ReadWriteOnce
-        advancedMounts:
-          comfyui:
-            app:
-            - path: /llm/ComfyUI/user
-        size: 2Gi
-        storageClass: ceph-block
-        type: persistentVolumeClaim
-    route:
-      app:
-        annotations:
-          gatus.home-operations.com/endpoint: |-
-            url: https://comfyui./
-            conditions:
-              # replicas: 0 is the default (parked). Envoy then returns 503;
-              # 200 is healthy when scaled up for an image session.
-              - "[STATUS] == any(200, 503)"
-            group: ai
-          gethomepage.dev/description: Intel Arc image generation (ComfyUI)
-          gethomepage.dev/enabled: 'true'
-          gethomepage.dev/group: LLM/Ai
-          gethomepage.dev/name: ComfyUI
-        hostnames:
-        - '{{ .Release.Name }}.'
-        parentRefs:
-        - name: envoy-internal
-          namespace: network
-          sectionName: https
-    service:
-      app:
-        ports:
-          http:
-            port: 8188
-
--- kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive OCIRepository: ai/toolhive-operator

+++ kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive OCIRepository: ai/toolhive-operator

@@ -1,19 +0,0 @@

----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive
-    kustomize.toolkit.fluxcd.io/name: toolhive
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: toolhive-operator
-  namespace: ai
-spec:
-  interval: 15m
-  layerSelector:
-    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
-    operation: copy
-  ref:
-    tag: 0.42.0
-  url: oci://ghcr.io/stacklok/toolhive/toolhive-operator
-
--- kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive HelmRelease: ai/toolhive-operator

+++ kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive HelmRelease: ai/toolhive-operator

@@ -1,44 +0,0 @@

----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive
-    kustomize.toolkit.fluxcd.io/name: toolhive
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: toolhive-operator
-  namespace: ai
-spec:
-  chartRef:
-    kind: OCIRepository
-    name: toolhive-operator
-  install:
-    crds: CreateReplace
-    strategy:
-      name: RetryOnFailure
-  interval: 30m
-  rollback:
-    cleanupOnFail: true
-    recreate: true
-  upgrade:
-    cleanupOnFail: true
-    crds: CreateReplace
-    remediation:
-      remediateLastFailure: true
-      retries: 2
-    strategy:
-      name: RemediateOnFailure
-  values:
-    operator:
-      gc:
-        gogc: 75
-        gomemlimit: 450MiB
-      replicaCount: 1
-      resources:
-        limits:
-          cpu: 500m
-          memory: 1Gi
-        requests:
-          cpu: 50m
-          memory: 256Mi
-
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway

@@ -59,13 +59,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/agentgateway/app
+  path: ./kubernetes/apps/base/ai/agentgateway/app
   postBuild:
     substitute:
       APP: agentgateway
     substituteFrom:
     - kind: Secret
       name: cluster-secrets
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-crds

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-crds

@@ -35,13 +35,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/agentgateway/crds
+  path: ./kubernetes/apps/base/ai/agentgateway/crds
   prune: true
   retryInterval: 1m
   sourceRef:
     kind: GitRepository
     name: flux-system
     namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-dashboards

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-dashboards

@@ -35,13 +35,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/agentgateway-dashboards/app
+  path: ./kubernetes/apps/base/ai/agentgateway-dashboards/app
   prune: true
   retryInterval: 2m
   sourceRef:
     kind: GitRepository
     name: flux-system
     namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentmemory

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentmemory

@@ -9,13 +9,13 @@

   namespace: ai
 spec:
   commonMetadata:
     labels:
       app.kubernetes.io/name: agentmemory
   components:
-  - ../../../../components/volsync
+  - ../../../../../components/volsync
   deletionPolicy: WaitForTermination
   dependsOn:
   - name: onepassword-store
     namespace: security
   - name: vllm
     namespace: ai
@@ -49,13 +49,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/agentmemory/app
+  path: ./kubernetes/apps/base/ai/agentmemory/app
   postBuild:
     substitute:
       APP: agentmemory
       CONFIG_TIMEZONE: America/New_York
       VOLSYNC_CAPACITY: 5Gi
       VOLSYNC_SCHEDULE_CEPH: 20 */4 * * *
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/comfyui

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/comfyui

@@ -35,13 +35,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/comfyui/app
+  path: ./kubernetes/apps/base/ai/comfyui/app
   postBuild:
     substitute:
       APP: comfyui
     substituteFrom:
     - kind: Secret
       name: cluster-secrets
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/hermes

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/hermes

@@ -9,13 +9,13 @@

   namespace: ai
 spec:
   commonMetadata:
     labels:
       app.kubernetes.io/name: hermes
   components:
-  - ../../../../components/volsync
+  - ../../../../../components/volsync
   deletionPolicy: WaitForTermination
   dependsOn:
   - name: onepassword-store
     namespace: security
   - name: agentgateway
     namespace: ai
@@ -49,13 +49,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/hermes/app
+  path: ./kubernetes/apps/base/ai/hermes/app
   postBuild:
     substitute:
       APP: hermes
       CONFIG_TIMEZONE: America/New_York
       VOLSYNC_CACHE_CAPACITY: 5Gi
       VOLSYNC_CAPACITY: 25Gi
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/searxng

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/searxng

@@ -9,13 +9,13 @@

   namespace: ai
 spec:
   commonMetadata:
     labels:
       app.kubernetes.io/name: searxng
   components:
-  - ../../../components/dragonfly
+  - ../../../../components/dragonfly
   deletionPolicy: WaitForTermination
   dependsOn:
   - name: dragonfly-operator
     namespace: database
   - name: onepassword-store
     namespace: security
@@ -47,13 +47,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/searxng
+  path: ./kubernetes/apps/base/ai/searxng
   postBuild:
     substitute:
       APP: searxng
       GATUS_GROUP: ai
     substituteFrom:
     - kind: Secret
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-crds

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-crds

@@ -35,13 +35,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/toolhive/crds
+  path: ./kubernetes/apps/base/ai/toolhive/crds
   prune: true
   retryInterval: 1m
   sourceRef:
     kind: GitRepository
     name: flux-system
     namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive

@@ -43,13 +43,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/toolhive/app
+  path: ./kubernetes/apps/base/ai/toolhive/app
   prune: true
   retryInterval: 1m
   sourceRef:
     kind: GitRepository
     name: flux-system
     namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-config

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-config

@@ -47,13 +47,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/toolhive/config
+  path: ./kubernetes/apps/base/ai/toolhive/config
   postBuild:
     substituteFrom:
     - kind: Secret
       name: cluster-secrets
   prune: true
   retryInterval: 1m
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-mcp-servers

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-mcp-servers

@@ -89,13 +89,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/toolhive/mcp-servers
+  path: ./kubernetes/apps/base/ai/toolhive/mcp-servers
   prune: true
   retryInterval: 1m
   sourceRef:
     kind: GitRepository
     name: flux-system
     namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/vllm

+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/vllm

@@ -43,13 +43,13 @@

           remediation:
             remediateLastFailure: true
             retries: 2
     target:
       group: helm.toolkit.fluxcd.io
       kind: HelmRelease
-  path: ./kubernetes/apps/ai/vllm/app
+  path: ./kubernetes/apps/base/ai/vllm/app
   postBuild:
     substitute:
       APP: vllm
       GATUS_GROUP: ai
     substituteFrom:
     - kind: Secret
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config EmbeddingServer: ai/mcp-tools-embedding

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config EmbeddingServer: ai/mcp-tools-embedding

@@ -1,17 +0,0 @@

----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: EmbeddingServer
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mcp-tools-embedding
-  namespace: ai
-spec:
-  env:
-  - name: HOSTNAME
-    value: '::'
-  image: ghcr.io/huggingface/text-embeddings-inference:cpu-latest@sha256:cb570aabbfa016b86684f576b5bd72d1ee96cc0b7a00b0ad221b298762b32157
-  model: sentence-transformers/all-MiniLM-L6-v2
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config HTTPRoute: ai/mcp-gateway

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config HTTPRoute: ai/mcp-gateway

@@ -1,28 +0,0 @@

----
-apiVersion: gateway.networking.k8s.io/v1
-kind: HTTPRoute
-metadata:
-  annotations:
-    external-dns.alpha.kubernetes.io/target: internal.${SECRET_DOMAIN}
-    gethomepage.dev/description: Aggregated MCP tool gateway
-    gethomepage.dev/enabled: 'true'
-    gethomepage.dev/group: AI
-    gethomepage.dev/name: ToolHive MCP
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mcp-gateway
-  namespace: ai
-spec:
-  hostnames:
-  - mcp.${SECRET_DOMAIN}
-  parentRefs:
-  - name: envoy-internal
-    namespace: network
-    sectionName: https
-  rules:
-  - backendRefs:
-    - name: vmcp-mcp-gateway-internal
-      port: 4483
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPTelemetryConfig: ai/prometheus

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPTelemetryConfig: ai/prometheus

@@ -1,14 +0,0 @@

----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: MCPTelemetryConfig
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: prometheus
-  namespace: ai
-spec:
-  prometheus:
-    enabled: true
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPGroup: ai/mcp-tools

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPGroup: ai/mcp-tools

@@ -1,13 +0,0 @@

----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: MCPGroup
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mcp-tools
-  namespace: ai
-spec:
-  description: Optimized MCP tools for AI assistants
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config PodMonitor: ai/mcp-gateway-internal

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config PodMonitor: ai/mcp-gateway-internal

@@ -1,23 +0,0 @@

----
-apiVersion: monitoring.coreos.com/v1
-kind: PodMonitor
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mcp-gateway-internal
-  namespace: ai
-spec:
-  namespaceSelector:
-    matchNames:
-    - ai
-  podMetricsEndpoints:
-  - interval: 15s
-    path: /metrics
-    port: '8080'
-  selector:
-    matchLabels:
-      app.kubernetes.io/instance: mcp-gateway-internal
-      app.kubernetes.io/name: virtualmcpserver
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config VirtualMCPServer: ai/mcp-gateway-internal

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config VirtualMCPServer: ai/mcp-gateway-internal

@@ -1,34 +0,0 @@

----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: VirtualMCPServer
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mcp-gateway-internal
-  namespace: ai
-spec:
-  config:
-    aggregation:
-      conflictResolution: prefix
-      conflictResolutionConfig:
-        prefixFormat: '{workload}_'
-  embeddingServerRef:
-    name: mcp-tools-embedding
-  groupRef:
-    name: mcp-tools
-  incomingAuth:
-    type: anonymous
-  outgoingAuth:
-    source: discovered
-  podTemplateSpec:
-    spec:
-      containers:
-      - name: vmcp
-        resources:
-          limits:
-            memory: 1Gi
-          requests:
-            memory: 256Mi
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config GrafanaDashboard: ai/toolhive-mcp-gateway

+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config GrafanaDashboard: ai/toolhive-mcp-gateway

@@ -1,17 +0,0 @@

----
-apiVersion: grafana.integreatly.org/v1beta1
-kind: GrafanaDashboard
-metadata:
-  labels:
-    app.kubernetes.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/name: toolhive-config
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: toolhive-mcp-gateway
-  namespace: ai
-spec:
-  allowCrossNamespaceImport: true
-  instanceSelector:
-    matchLabels:
-      grafana.internal/instance: grafana
-  url: https://raw.githubusercontent.com/stacklok/toolhive/main/examples/otel/grafana-dashboards/toolhive-mcp-grafana-dashboard-otel-scrape.json
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ExternalSecret: ai/searxng

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ExternalSecret: ai/searxng

@@ -1,23 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng
-  namespace: ai
-spec:
-  dataFrom:
-  - extract:
-      key: searxng
-  secretStoreRef:
-    kind: ClusterSecretStore
-    name: onepassword
-  target:
-    name: searxng
-    template:
-      data:
-        SEARXNG_SECRET: '{{ .SEARXNG_SECRET_KEY }}'
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng HelmRelease: ai/searxng

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng HelmRelease: ai/searxng

@@ -1,130 +0,0 @@

----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng
-  namespace: ai
-spec:
-  chartRef:
-    kind: OCIRepository
-    name: app-template
-  install:
-    crds: CreateReplace
-    remediation:
-      retries: -1
-    strategy:
-      name: RetryOnFailure
-  interval: 1h
-  rollback:
-    cleanupOnFail: true
-    recreate: true
-  upgrade:
-    cleanupOnFail: true
-    crds: CreateReplace
-    remediation:
-      remediateLastFailure: true
-      retries: 2
-    strategy:
-      name: RemediateOnFailure
-  values:
-    controllers:
-      searxng:
-        annotations:
-          reloader.stakater.com/auto: 'true'
-        containers:
-          main:
-            env:
-              SEARXNG_BASE_URL: https://search.
-              SEARXNG_PORT: 8080
-              SEARXNG_REDIS_URL: redis://searxng-dragonfly:6379
-              UWSGI_THREADS: '2'
-              UWSGI_WORKERS: '4'
-            envFrom:
-            - secretRef:
-                name: searxng
-            image:
-              repository: ghcr.io/searxng/searxng
-              tag: 2025.5.17-86373e7@sha256:2f45ccc0b330faa47d8706de883c6e583b38806e32b51172d93c381ce1d92f0b
-            probes:
-              liveness:
-                custom: true
-                enabled: true
-                spec:
-                  failureThreshold: 3
-                  httpGet:
-                    path: /stats
-                    port: 8080
-                  initialDelaySeconds: 0
-                  periodSeconds: 10
-                  timeoutSeconds: 5
-              readiness:
-                custom: true
-                enabled: true
-                spec:
-                  failureThreshold: 3
-                  httpGet:
-                    path: /stats
-                    port: 8080
-                  initialDelaySeconds: 0
-                  periodSeconds: 10
-                  timeoutSeconds: 5
-            resources:
-              limits:
-                memory: 2Gi
-              requests:
-                cpu: 10m
-                memory: 512Mi
-            securityContext:
-              allowPrivilegeEscalation: false
-              capabilities:
-                add:
-                - CHOWN
-                - SETGID
-                - SETUID
-                - DAC_OVERRIDE
-                drop:
-                - ALL
-              readOnlyRootFilesystem: true
-        replicas: 1
-        strategy: RollingUpdate
-    persistence:
-      config:
-        globalMounts:
-        - path: /etc/searxng/settings.yml
-          readOnly: true
-          subPath: settings.yml
-        - path: /etc/searxng/limiter.toml
-          readOnly: true
-          subPath: limiter.toml
-        name: searxng-configmap
-        type: configMap
-      tmpfs:
-        enabled: true
-        globalMounts:
-        - path: /tmp
-        type: emptyDir
-    route:
-      app:
-        annotations:
-          gatus.home-operations.com/endpoint: |-
-            url: https://search./stats
-            conditions:
-              - "[STATUS] == 200"
-            group: ai
-        hostnames:
-        - '{{ .Release.Name }}.'
-        - search.
-        parentRefs:
-        - name: envoy-internal
-          namespace: network
-          sectionName: https
-    service:
-      app:
-        ports:
-          http:
-            port: 8080
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-configmap

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-configmap

@@ -1,115 +0,0 @@

----
-apiVersion: v1
-data:
-  limiter.toml: |
-    [real_ip]
-
-    # Number of values to trust for X-Forwarded-For.
-
-    x_for = 1
-
-    # The prefix defines the number of leading bits in an address that are compared
-    # to determine whether or not an address is part of a (client) network.
-
-    ipv4_prefix = 32
-    ipv6_prefix = 48
-
-    [botdetection.ip_limit]
-
-    # To get unlimited access in a local network, by default link-lokal addresses
-    # (networks) are not monitored by the ip_limit
-    filter_link_local = true
-
-    # activate link_token method in the ip_limit method
-    link_token = true
-
-    [botdetection.ip_lists]
-
-    # In the limiter, the ip_lists method has priority over all other methods -> if
-    # an IP is in the pass_ip list, it has unrestricted access and it is also not
-    # checked if e.g. the "user agent" suggests a bot (e.g. curl).
-
-    block_ip = [
-    ]
-
-    pass_ip = [
-      '192.168.0.0/16',      # IPv4 private network
-      '10.0.0.0/8',          # IPv4 private network
-    ]
-
-    # Activate passlist of (hardcoded) IPs from the SearXNG organization,
-    # e.g. `check.searx.space`.
-    pass_searxng_org = false
-  settings.yml: |
-    ---
-    use_default_settings: true
-
-    server:
-      limiter: true
-      image_proxy: true
-      method: GET # https://github.com/searxng/searxng/pull/3619
-      public_instance: false
-
-    search:
-      autocomplete: brave
-      favicon_resolver: duckduckgo
-      languages:
-        - all
-        - en
-        - en-US
-        - pl
-        - pl-PL
-      formats:
-        - html
-        - json
-
-    engines:
-      - name: wolframalpha
-        disabled: false
-
-    general:
-      instance_name: home-ops Search
-
-    ui:
-      default_theme: simple
-      infinite_scroll: true
-      query_in_title: true
-      results_on_new_tab: true
-      static_use_hash: true
-      theme_args:
-        simple_style: auto
-
-    categories_as_tabs:
-      general:
-      images:
-      videos:
-      map:
-
-    enabled_plugins:
-      - Basic Calculator
-      - Hash plugin
-      - Open Access DOI rewrite
-      - Self Informations
-      - Tracker URL remover
-      - Unit converter plugin
-
-    hostnames:
-      high_priority:
-        - (.*)\/blog\/(.*)
-        - (.*\.)?wikipedia.org$
-        - (.*\.)?github.com$
-        - (.*\.)?reddit.com$
-        - (.*\.)?docker.com$
-        - (.*\.)?archlinux.org$
-        - (.*\.)?stackoverflow.com$
-        - (.*\.)?askubuntu.com$
-        - (.*\.)?superuser.com$
-kind: ConfigMap
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng-configmap
-  namespace: ai
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng Dragonfly: ai/searxng-dragonfly

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng Dragonfly: ai/searxng-dragonfly

@@ -1,34 +0,0 @@

----
-apiVersion: dragonflydb.io/v1alpha1
-kind: Dragonfly
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng-dragonfly
-  namespace: ai
-spec:
-  args:
-  - --maxmemory=512Mi
-  - --proactor_threads=2
-  - --cluster_mode=emulated
-  - --cache_mode=true
-  - --default_lua_flags=allow-undeclared-keys
-  image: ghcr.io/dragonflydb/dragonfly:v1.40.1
-  replicas: 2
-  resources:
-    limits:
-      cpu: 250m
-      memory: 640Mi
-    requests:
-      cpu: 250m
-      memory: 640Mi
-  topologySpreadConstraints:
-  - labelSelector:
-      matchLabels:
-        app.kubernetes.io/part-of: dragonfly
-    maxSkew: 1
-    topologyKey: kubernetes.io/hostname
-    whenUnsatisfiable: DoNotSchedule
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng PodMonitor: ai/searxng-dragonfly

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng PodMonitor: ai/searxng-dragonfly

@@ -1,20 +0,0 @@

----
-apiVersion: monitoring.coreos.com/v1
-kind: PodMonitor
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng-dragonfly
-  namespace: ai
-spec:
-  fallbackScrapeProtocol: PrometheusText0.0.4
-  podMetricsEndpoints:
-  - port: admin
-  podTargetLabels:
-  - app
-  selector:
-    matchLabels:
-      app: searxng-dragonfly
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng NetworkPolicy: ai/searxng-dragonfly-allow-prometheus

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng NetworkPolicy: ai/searxng-dragonfly-allow-prometheus

@@ -1,29 +0,0 @@

----
-apiVersion: networking.k8s.io/v1
-kind: NetworkPolicy
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng-dragonfly-allow-prometheus
-  namespace: ai
-spec:
-  ingress:
-  - from:
-    - namespaceSelector:
-        matchLabels:
-          kubernetes.io/metadata.name: monitoring
-      podSelector:
-        matchLabels:
-          app.kubernetes.io/name: prometheus
-    ports:
-    - port: 9999
-      protocol: TCP
-  podSelector:
-    matchLabels:
-      app: searxng-dragonfly
-      app.kubernetes.io/part-of: dragonfly
-  policyTypes:
-  - Ingress
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-dragonfly-gatus-ep

+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-dragonfly-gatus-ep

@@ -1,27 +0,0 @@

----
-apiVersion: v1
-data:
-  config.yaml: |
-    endpoints:
-      - name: Redis (searxng)
-        group: Services
-        url: tcp://searxng-dragonfly.ai.svc.cluster.local:6379
-        interval: 1m
-        ui:
-          hide-url: true
-          hide-hostname: true
-        conditions:
-          - "[CONNECTED] == true"
-        alerts:
-          - type: pushover
-            send-on-resolved: true
-kind: ConfigMap
-metadata:
-  labels:
-    app.kubernetes.io/name: searxng
-    gatus.io/enabled: 'true'
-    kustomize.toolkit.fluxcd.io/name: searxng
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: searxng-dragonfly-gatus-ep
-  namespace: ai
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/anthropic-secret

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/anthropic-secret

@@ -1,24 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: anthropic-secret
-  namespace: ai
-spec:
-  dataFrom:
-  - extract:
-      key: ai-keys
-  refreshInterval: 1h
-  secretStoreRef:
-    kind: ClusterSecretStore
-    name: onepassword
-  target:
-    name: anthropic-secret
-    template:
-      data:
-        Authorization: '{{ .ANTHROPIC_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/anthropic

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/anthropic

@@ -1,25 +0,0 @@

----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: anthropic
-  namespace: ai
-spec:
-  ai:
-    provider:
-      anthropic: {}
-  policies:
-    ai:
-      routes:
-        '*': Passthrough
-        /v1/chat/completions: Completions
-        /v1/messages: Messages
-        /v1/models: Passthrough
-    auth:
-      secretRef:
-        name: anthropic-secret
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/openai-secret

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/openai-secret

@@ -1,24 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: openai-secret
-  namespace: ai
-spec:
-  dataFrom:
-  - extract:
-      key: ai-keys
-  refreshInterval: 1h
-  secretStoreRef:
-    kind: ClusterSecretStore
-    name: onepassword
-  target:
-    name: openai-secret
-    template:
-      data:
-        Authorization: '{{ .OPENAI_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/openai

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/openai

@@ -1,25 +0,0 @@

----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: openai
-  namespace: ai
-spec:
-  ai:
-    provider:
-      openai: {}
-  policies:
-    ai:
-      routes:
-        '*': Passthrough
-        /v1/chat/completions: Completions
-        /v1/embeddings: Passthrough
-        /v1/models: Passthrough
-    auth:
-      secretRef:
-        name: openai-secret
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/deepseek-secret

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/deepseek-secret

@@ -1,24 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: deepseek-secret
-  namespace: ai
-spec:
-  dataFrom:
-  - extract:
-      key: ai-keys
-  refreshInterval: 1h
-  secretStoreRef:
-    kind: ClusterSecretStore
-    name: onepassword
-  target:
-    name: deepseek-secret
-    template:
-      data:
-        Authorization: '{{ .DEEPSEEK_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/deepseek

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/deepseek

@@ -1,28 +0,0 @@

----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: deepseek
-  namespace: ai
-spec:
-  ai:
-    provider:
-      host: api.deepseek.com
-      openai: {}
-      port: 443
-  policies:
-    ai:
-      routes:
-        '*': Passthrough
-        /v1/chat/completions: Completions
-        /v1/embeddings: Passthrough
-        /v1/models: Passthrough
-    auth:
-      secretRef:
-        name: deepseek-secret
-    tls: {}
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/mistral-secret

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/mistral-secret

@@ -1,24 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mistral-secret
-  namespace: ai
-spec:
-  dataFrom:
-  - extract:
-      key: ai-keys
-  refreshInterval: 1h
-  secretStoreRef:
-    kind: ClusterSecretStore
-    name: onepassword
-  target:
-    name: mistral-secret
-    template:
-      data:
-        Authorization: '{{ .MISTRAL_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/mistral

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/mistral

@@ -1,28 +0,0 @@

----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
-  labels:
-    app.kubernetes.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/name: agentgateway
-    kustomize.toolkit.fluxcd.io/namespace: ai
-  name: mistral
-  namespace: ai
-spec:
-  ai:
-    provider:
-      host: api.mistral.ai
-      openai: {}
-      port: 443
-  policies:
-    ai:
-      routes:
-        '*': Passthrough
-        /v1/chat/completions: Completions
-        /v1/embeddings: Passthrough
-        /v1/models: Passthrough
-    auth:
-      secretRef:
-        name: mistral-secret
-    tls: {}
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/gemini-secret

+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/gemini-secret

@@ -1,24 +0,0 @@

----
-apiVersion: external-secrets.io/v1
-kind: ExternalSec

@Aviator-Coding
Aviator-Coding merged commit 7d2fc1b into main Aug 24, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant