@kwirthmagnify/kwirth-docs-pinocchio 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_sidebar.md +21 -0
- package/admin/01-setup.md +98 -0
- package/admin/02-ai-config.md +125 -0
- package/admin/03-tools.md +131 -0
- package/admin/04-prompts.md +147 -0
- package/admin/05-rbac.md +89 -0
- package/admin/06-limits.md +113 -0
- package/images/admin-ai-llm.png +0 -0
- package/images/admin-ai-provider.png +0 -0
- package/images/import-export.png +0 -0
- package/images/playground-call.png +0 -0
- package/images/playground-in.png +0 -0
- package/images/playground-llm.png +0 -0
- package/images/playground-out.png +0 -0
- package/images/tool-selector.png +0 -0
- package/images/triggers-dialog.png +0 -0
- package/images/ui-clear-dialog.png +0 -0
- package/images/ui-config-menu.png +0 -0
- package/images/ui-tab.png +0 -0
- package/index.html +64 -0
- package/index.md +42 -0
- package/kwirth-dark.css +458 -0
- package/package.json +9 -0
- package/serve.cmd +1 -0
- package/serve.mjs +84 -0
- package/user/00-how-it-works.md +88 -0
- package/user/01-introduction.md +60 -0
- package/user/02-ui-tour.md +96 -0
- package/user/03-concepts.md +160 -0
- package/user/04-triggers.md +96 -0
- package/user/05-findings.md +108 -0
- package/user/06-playground.md +134 -0
- package/user/07-import-export.md +83 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Límites conocidos
|
|
2
|
+
|
|
3
|
+
Lista honesta de lo que Pinocchio **no** hace, o hace de forma distinta a la que su UI sugiere. Todo lo de
|
|
4
|
+
esta página está verificado contra el código del plugin, no supuesto. Si algo te está pasando y aparece
|
|
5
|
+
aquí, no es tu configuración.
|
|
6
|
+
|
|
7
|
+
## Configuración de IA
|
|
8
|
+
|
|
9
|
+
**La config de IA sólo se lee al arrancar el canal.** Los providers y los LLMs se cargan del almacén común en
|
|
10
|
+
el arranque de la instancia. Si un administrador crea un provider desde los menús *AI Providers* del core con
|
|
11
|
+
el canal ya abierto, ese canal no lo verá hasta que se cierre y se reabra.
|
|
12
|
+
*Workaround:* configúralo desde el propio menú **Config** de Pinocchio, que sí notifica al canal, o reabre el
|
|
13
|
+
canal.
|
|
14
|
+
|
|
15
|
+
**La config de IA no viaja entre clústeres.** Los menús *AI Providers* / *AI Models* del core escriben en el
|
|
16
|
+
backend **local**, pero un canal abierto contra otro kwirth lee el almacén de **ese** clúster. En una
|
|
17
|
+
federación hay que configurar providers y LLMs en cada clúster.
|
|
18
|
+
|
|
19
|
+
**Las opciones de salida estructurada se eligen por el `Name` del provider, no por su `Type`.** El modelo se
|
|
20
|
+
construye bien (por tipo), pero los `providerOptions` (`structuredOutputs`, `strictJsonSchema`) se deciden con
|
|
21
|
+
un `switch` sobre el nombre. Un provider de tipo `google` llamado `gemini-prod` pierde el
|
|
22
|
+
`structuredOutputs: true` y sus triggers `artifact` pueden empezar a fallar.
|
|
23
|
+
*Workaround:* deja el `Name` del provider igual que su `Type`.
|
|
24
|
+
|
|
25
|
+
## Triggers
|
|
26
|
+
|
|
27
|
+
**El campo `Action` no está implementado.** El selector ofrece `inform`, `cancel` y `repair`, y el valor se
|
|
28
|
+
guarda en la configuración, pero el backend **nunca lo lee**. Todo se comporta como `inform`: se analiza y se
|
|
29
|
+
informa. Pinocchio no bloquea ni repara nada.
|
|
30
|
+
|
|
31
|
+
**El campo `Spaces` no filtra nada.** En un trigger `business` puedes escribir `orders.created`, pero el
|
|
32
|
+
matching no lo usa: **todos** los triggers `business` con una versión activa se disparan con **cualquier**
|
|
33
|
+
evento de negocio que llegue al canal. El único filtrado real es el de la suscripción del canal, que está
|
|
34
|
+
fijada en el código a `customers.status`, `branches.status` y `launch.immediate`.
|
|
35
|
+
|
|
36
|
+
**Los prompts `business` se renderizan con contexto vacío.** El backend calcula un objeto con los datos de los
|
|
37
|
+
espacios declarados… y luego llama a `nunjucks.renderString(prompt, {})`. Los datos del evento **no llegan a
|
|
38
|
+
la plantilla**: cualquier `{{ variable }}` sale como cadena vacía.
|
|
39
|
+
|
|
40
|
+
**Los triggers `business` ignoran el `system` de la versión.** El backend usa un system fijo
|
|
41
|
+
(*"Use the tools provided to find information…"*). El `system` que escribas en el editor se guarda pero no se
|
|
42
|
+
envía al modelo.
|
|
43
|
+
|
|
44
|
+
## Playground
|
|
45
|
+
|
|
46
|
+
**`Export → New trigger` pierde el `Kind` y el `K8s Event`.** El trigger nuevo se crea con el tipo y la
|
|
47
|
+
versión, pero sin `kind` ni `k8sEvent`. Un trigger `artifact` recién exportado **no casa con ningún evento**.
|
|
48
|
+
*Workaround:* abre **Config → Trigger** justo después y ponle el kind a mano.
|
|
49
|
+
|
|
50
|
+
**El selector `K8s Event` del Playground no hace nada.** El objeto que inyectas siempre se le entrega al
|
|
51
|
+
modelo como un evento `ADDED`. El valor se guarda con el estado del Playground, pero no cambia la simulación.
|
|
52
|
+
|
|
53
|
+
**En modo Artifact, el `Prompt type` que elijas no siempre manda.** El backend lo deriva de si el campo Prompt
|
|
54
|
+
tiene texto: con prompt, `jinja`; vacío, `artifact`.
|
|
55
|
+
*Workaround:* para probar `artifact` puro, vacía el campo Prompt.
|
|
56
|
+
|
|
57
|
+
**En modo Business, el payload es el prompt.** El backend descarta el campo `Prompt` y usa el contenido del
|
|
58
|
+
textarea de evento como prompt.
|
|
59
|
+
|
|
60
|
+
**En modo Business, cambiar `Space`/`Type` desvía el disparo.** Sólo un evento con `launch`/`immediate` se
|
|
61
|
+
redirige al Playground. Con otros valores, el evento pasa a evaluarse contra los triggers de negocio
|
|
62
|
+
**reales**, y si además el par no es uno de los tres a los que el canal está suscrito, no llega a ninguna
|
|
63
|
+
parte y no verás nada.
|
|
64
|
+
|
|
65
|
+
**El Playground nunca produce findings.** Usa `generateText` sin esquema de salida: devuelve texto libre. El
|
|
66
|
+
formato estructurado sólo aparece cuando el trigger se dispara de verdad.
|
|
67
|
+
|
|
68
|
+
## Salida y persistencia
|
|
69
|
+
|
|
70
|
+
**`hardened_yaml` se genera pero no se ve.** El esquema de salida pide al modelo un manifiesto endurecido, el
|
|
71
|
+
backend lo guarda en el análisis… y **ninguna pantalla lo muestra**. Se paga en tokens y no se aprovecha.
|
|
72
|
+
*Workaround parcial:* pide en el `system` que el YAML corregido vaya también dentro del `report`, que sí se
|
|
73
|
+
renderiza.
|
|
74
|
+
|
|
75
|
+
**Los análisis no se persisten.** Viven en memoria del canal, con un tope de **50**; a partir de ahí se
|
|
76
|
+
descarta el más antiguo. Un reinicio del backend los pierde todos. Si necesitas conservar un hallazgo,
|
|
77
|
+
expórtalo tú (copia el informe).
|
|
78
|
+
|
|
79
|
+
**El buffer de métricas es de 100 lecturas.** Las tools de histórico (`get_prev_*`) no pueden mirar más atrás
|
|
80
|
+
de eso, y arrancan vacías al abrir el canal.
|
|
81
|
+
|
|
82
|
+
## Alcance y seguridad
|
|
83
|
+
|
|
84
|
+
**No hay filtro de sólo-lectura en las tools.** El interruptor `Auto` de un trigger entrega el catálogo
|
|
85
|
+
**completo**, incluidas `delete_pod`, `restart_deployment`, `add_node`, `remove_node` y el escalado. Se
|
|
86
|
+
ejecutan con el service account del backend, no con los permisos del usuario. Ver
|
|
87
|
+
[Permisos y acceso](05-rbac.md).
|
|
88
|
+
|
|
89
|
+
**No hay permisos granulares.** El canal sólo admite los scopes `none` y `cluster`, y cualquiera de los dos
|
|
90
|
+
da acceso completo: leer y borrar los análisis de todos, y editar los providers de IA compartidos, claves
|
|
91
|
+
incluidas.
|
|
92
|
+
|
|
93
|
+
**Los objetos preexistentes no se analizan.** Ante un `ADDED`, si el `creationTimestamp` del objeto es
|
|
94
|
+
anterior al arranque del canal, se descarta. Es intencionado —evita analizar el clúster entero cada vez que
|
|
95
|
+
alguien abre el canal— pero significa que no puedes auditar lo que ya existe sin recrearlo o pasarlo por el
|
|
96
|
+
Playground.
|
|
97
|
+
|
|
98
|
+
**Los kinds vigilados están fijados en el código.** `Pod`, `Deployment`, `DaemonSet`, `StatefulSet`,
|
|
99
|
+
`ReplicaSet`, `Job`, `CronJob`, `ReplicationController`, `Service`, `Ingress`, `HTTPRoute`. No hay CRDs y no
|
|
100
|
+
es configurable desde la UI.
|
|
101
|
+
|
|
102
|
+
## Cosméticos
|
|
103
|
+
|
|
104
|
+
**`medium` se pinta en verde.** El código de colores es `critical`=rojo, `high`=naranja, `medium`=verde,
|
|
105
|
+
`low`=gris. Guíate por el texto de la etiqueta.
|
|
106
|
+
|
|
107
|
+
**El formateo de la descripción de un finding es mínimo.** Un fragmento entre ` **` y `** ` se pinta en
|
|
108
|
+
negrita y subrayado, y sólo el primero de la cadena. No es markdown. El markdown de verdad está en el
|
|
109
|
+
**Report**.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
El backlog de desarrollo con el estado de estos puntos está en `plans/pinocchio/PLAN.md`.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.html
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Pinocchio — Guide</title>
|
|
6
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
|
7
|
+
<meta name="description" content="Pinocchio — user & administration guide">
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
|
9
|
+
<link rel="stylesheet" href="../../docsify/vue.css">
|
|
10
|
+
<link rel="stylesheet" href="kwirth-dark.css">
|
|
11
|
+
<style>
|
|
12
|
+
.sidebar { width: 320px; }
|
|
13
|
+
.content { left: 320px; }
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div id="app"></div>
|
|
18
|
+
<script>
|
|
19
|
+
// Colapsable de secciones propio (sin plugin): togglea con el chevron, abre por defecto,
|
|
20
|
+
// mantiene abierta la seccion de la pagina activa y NO se contrae al navegar.
|
|
21
|
+
var sectionState = {}
|
|
22
|
+
window.$docsify = {
|
|
23
|
+
homepage: 'index.md',
|
|
24
|
+
relativePath: false,
|
|
25
|
+
loadSidebar: true,
|
|
26
|
+
auto2top: true,
|
|
27
|
+
name: 'Pinocchio',
|
|
28
|
+
subMaxLevel: 0,
|
|
29
|
+
search: {
|
|
30
|
+
paths: 'auto',
|
|
31
|
+
placeholder: 'Search...',
|
|
32
|
+
noData: 'No results',
|
|
33
|
+
depth: 4
|
|
34
|
+
},
|
|
35
|
+
plugins: [
|
|
36
|
+
function (hook) {
|
|
37
|
+
hook.doneEach(function () {
|
|
38
|
+
var secs = document.querySelectorAll('.sidebar-nav > ul > li')
|
|
39
|
+
secs.forEach(function (li) {
|
|
40
|
+
var sub = li.querySelector(':scope > ul')
|
|
41
|
+
var head = li.querySelector(':scope > strong, :scope > p > strong')
|
|
42
|
+
if (!sub || !head) return
|
|
43
|
+
li.classList.add('has-children')
|
|
44
|
+
var key = head.textContent.trim()
|
|
45
|
+
if (sectionState[key] === undefined) sectionState[key] = true // abierto por defecto
|
|
46
|
+
var active = !!li.querySelector('a.active')
|
|
47
|
+
li.classList.toggle('open', sectionState[key] || active) // la activa siempre abierta
|
|
48
|
+
head.style.cursor = 'pointer'
|
|
49
|
+
head.onclick = function (e) {
|
|
50
|
+
e.preventDefault(); e.stopPropagation()
|
|
51
|
+
sectionState[key] = !li.classList.contains('open')
|
|
52
|
+
li.classList.toggle('open', sectionState[key])
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
</script>
|
|
60
|
+
<script src="../../docsify/docsify.min.js"></script>
|
|
61
|
+
<script src="../../docsify/search.min.js"></script>
|
|
62
|
+
<script src="../../docsify/docsify-copy-code.min.js"></script>
|
|
63
|
+
</body>
|
|
64
|
+
</html>
|
package/index.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Pinocchio — análisis agéntico de tu clúster
|
|
2
|
+
|
|
3
|
+
**Pinocchio** es un plugin de kwirth que pone un **LLM a mirar lo que pasa en tu clúster**. No es un chat:
|
|
4
|
+
es un canal que **escucha eventos** —altas y cambios de recursos de Kubernetes, o eventos de negocio que le
|
|
5
|
+
manda un sistema externo— y, cuando uno encaja con un **trigger** que tú has definido, invoca al modelo con
|
|
6
|
+
tu prompt y tus *tools*, y devuelve **findings** estructurados y un **informe**.
|
|
7
|
+
|
|
8
|
+
La diferencia con "pegar un YAML en un chat" es que Pinocchio **vive dentro del clúster**: el modelo puede
|
|
9
|
+
llamar a herramientas que consultan namespaces, workloads, métricas, logs, eventos, ConfigMaps o el
|
|
10
|
+
histórico de rollouts. Analiza el recurso *y su contexto real*, no un fragmento fuera de sitio.
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
## Qué encontrarás en esta guía
|
|
15
|
+
|
|
16
|
+
**Guía de usuario** — entender, configurar y explotar el canal:
|
|
17
|
+
|
|
18
|
+
- [Introducción y modelo mental](user/01-introduction.md) · [Cómo funciona](user/00-how-it-works.md)
|
|
19
|
+
- [Triggers, versiones y prompts](user/03-concepts.md)
|
|
20
|
+
- [Recorrido por la UI](user/02-ui-tour.md) · [Configurar triggers](user/04-triggers.md)
|
|
21
|
+
- [Leer los findings](user/05-findings.md) · [El Playground](user/06-playground.md)
|
|
22
|
+
- [Import / Export de triggers](user/07-import-export.md)
|
|
23
|
+
|
|
24
|
+
**Guía de administrador** — instalar, conectar el LLM y gobernar el acceso:
|
|
25
|
+
|
|
26
|
+
- [Instalación](admin/01-setup.md) · [Providers y modelos de IA](admin/02-ai-config.md)
|
|
27
|
+
- [Tools y pasos del agente](admin/03-tools.md) · [Plantillas de prompt](admin/04-prompts.md)
|
|
28
|
+
- [Permisos y acceso](admin/05-rbac.md) · [Límites conocidos](admin/06-limits.md)
|
|
29
|
+
|
|
30
|
+
## Empieza aquí
|
|
31
|
+
|
|
32
|
+
1. Lee [Cómo funciona](user/00-how-it-works.md) para tener el bucle completo en la cabeza: evento → trigger →
|
|
33
|
+
prompt → modelo (+ tools) → findings.
|
|
34
|
+
2. Pide a tu administrador que configure un **provider** y un **LLM** ([Providers y modelos](admin/02-ai-config.md)).
|
|
35
|
+
Sin eso el menú *Config* no te deja crear triggers.
|
|
36
|
+
3. Abre el **Playground** ([El Playground](user/06-playground.md)) y afina un prompt contra un artefacto de
|
|
37
|
+
ejemplo, **sin tocar producción**.
|
|
38
|
+
4. Cuando funcione, expórtalo a un trigger real desde el propio Playground y actívalo.
|
|
39
|
+
|
|
40
|
+
> ⚠️ Pinocchio **gasta tokens de tu proveedor de IA**. Un trigger sobre `Pod`/`MODIFIED` en un clúster vivo
|
|
41
|
+
> puede dispararse cientos de veces al día. Lee [Tools y pasos del agente](admin/03-tools.md) antes de
|
|
42
|
+
> activar nada en un entorno grande.
|