From 63649a642a9681bb72bd6d3cd0862de43a6d5510 Mon Sep 17 00:00:00 2001 From: alessandro barucci Date: Sun, 20 Sep 2026 19:26:05 +0200 Subject: [PATCH 1/3] varie --- .../Dockerfile.byo-agent-example | 21 +++ add-on/AgentPlatform/IDP-AgentPlatform.docx | Bin 0 -> 19239 bytes .../Langflow/Langflow installazione.txt | 7 + .../Langflow/langflow-httproute.yaml | 61 +++++++ .../Langflow/langflow-secrets-setup.sh | 35 ++++ .../Langflow/langflow-values.yaml | 87 +++++++++ .../agent-declarative-vs-byo.yaml | 166 ++++++++++++++++++ add-on/monitoring/blackbox-exporter.md | 126 ++++++++++++- pipeline/add-hostalias.sh | 75 ++++++++ pipeline/addlistener.sh | 8 +- pipeline/deploy.sh | 37 ---- 11 files changed, 578 insertions(+), 45 deletions(-) create mode 100644 add-on/AgentPlatform/Dockerfile.byo-agent-example create mode 100644 add-on/AgentPlatform/IDP-AgentPlatform.docx create mode 100644 add-on/AgentPlatform/Langflow/Langflow installazione.txt create mode 100644 add-on/AgentPlatform/Langflow/langflow-httproute.yaml create mode 100644 add-on/AgentPlatform/Langflow/langflow-secrets-setup.sh create mode 100644 add-on/AgentPlatform/Langflow/langflow-values.yaml create mode 100644 add-on/AgentPlatform/agent-declarative-vs-byo.yaml create mode 100644 pipeline/add-hostalias.sh diff --git a/add-on/AgentPlatform/Dockerfile.byo-agent-example b/add-on/AgentPlatform/Dockerfile.byo-agent-example new file mode 100644 index 0000000..d17151d --- /dev/null +++ b/add-on/AgentPlatform/Dockerfile.byo-agent-example @@ -0,0 +1,21 @@ +# Dockerfile di esempio — containerizza un flow esportato da Langflow +# come Python app standalone, da usare nel percorso BYO (Esempio B). + +FROM python:3.11-slim + +WORKDIR /app + +# requirements.txt generato/estratto insieme all'export del flow +# (langflow, langgraph-checkpointer-kagent, e le dipendenze del tuo flow) +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Codice esportato dal builder low-code + eventuali customizzazioni +# del developer (es. integrazione kagentCheckpointer se usi LangGraph) +COPY . . + +# L'agente deve esporre un endpoint compatibile A2A sulla porta +# dichiarata in byo.deployment.port dell'Agent CR +EXPOSE 8080 + +CMD ["python", "agent_server.py"] diff --git a/add-on/AgentPlatform/IDP-AgentPlatform.docx b/add-on/AgentPlatform/IDP-AgentPlatform.docx new file mode 100644 index 0000000000000000000000000000000000000000..d82f72aa98f287f4baf058ccd9ea9aebf4e7f414 GIT binary patch literal 19239 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" + +# 3. Secret credenziali LLM — STESSO Secret già usato per kagent nel +# golden path di onboarding-team: se lo hai già creato per kagent +# in questo namespace, questo passaggio è già fatto, verifica solo +# che contenga le chiavi coi nomi attesi (vedi sotto). +# +# Se non esiste ancora, crealo così (aggiungi/rimuovi provider a +# seconda di cosa serve al team): +kubectl create secret generic llm-credentials \ + -n langflow-team-alpha \ + --from-literal=openai-api-key="sk-..." \ + --from-literal=anthropic-api-key="sk-ant-..." + +# Se il Secret esiste già (es. creato per kagent) e vuoi solo +# aggiungere/aggiornare una chiave senza ricrearlo da zero: +kubectl patch secret llm-credentials -n langflow-team-alpha \ + --type=json \ + -p='[{"op":"add","path":"/data/openai-api-key","value":"'$(echo -n "sk-..." | base64)'"}]' + +# 4. Verifica che tutti i Secret siano presenti prima di installare/ +# aggiornare la release Helm +kubectl get secrets -n langflow-team-alpha diff --git a/add-on/AgentPlatform/Langflow/langflow-values.yaml b/add-on/AgentPlatform/Langflow/langflow-values.yaml new file mode 100644 index 0000000..632ff97 --- /dev/null +++ b/add-on/AgentPlatform/Langflow/langflow-values.yaml @@ -0,0 +1,87 @@ +# values.yaml — Langflow IDE, personalizzato per un namespace-tenant +# Uso: helm install langflow-ide langflow/langflow-ide -f values.yaml -n + +langflow: + backend: + image: + repository: langflowai/langflow + tag: "1.10.0" # fissa una versione esplicita, evita 'latest' in produzione + + resources: + requests: + cpu: 250m + memory: 512Mi + limits: + cpu: "1" + memory: 2Gi + + # Variabili LLM/DB — usa Secret, mai valori in chiaro qui + env: + - name: LANGFLOW_DATABASE_URL + valueFrom: + secretKeyRef: + name: langflow-db-secret + key: connection-string + - name: LANGFLOW_SUPERUSER + valueFrom: + secretKeyRef: + name: langflow-admin-secret + key: username + - name: LANGFLOW_SUPERUSER_PASSWORD + valueFrom: + secretKeyRef: + name: langflow-admin-secret + key: password + # Rimuove automaticamente eventuali API key salvate nei flow prima + # di persisterli a DB — best practice di sicurezza, seconda linea + # di difesa oltre alle Global Variable qui sotto + - name: LANGFLOW_REMOVE_API_KEYS + value: "true" + + # --- Pre-caricamento credenziali LLM come Global Variable --- + # Riusa lo stesso Secret 'llm-credentials' già previsto per kagent + # in fase di onboarding del team (vedi golden path Backstage). + # I developer trovano le chiavi già pronte nel dropdown Global + # Variable, senza mai vederne il valore reale. + - name: LANGFLOW_STORE_ENVIRONMENT_VARIABLES + value: "true" + - name: LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT + value: "OPENAI_API_KEY,ANTHROPIC_API_KEY" + - name: OPENAI_API_KEY + valueFrom: + secretKeyRef: + name: llm-credentials + key: openai-api-key + optional: true # non tutti i team useranno tutti i provider + - name: ANTHROPIC_API_KEY + valueFrom: + secretKeyRef: + name: llm-credentials + key: anthropic-api-key + optional: true + + frontend: + image: + repository: langflowai/langflow + tag: "1.10.0" + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + +# Ingress classico DISABILITATO — l'esposizione avviene via Gateway API +# (nginx Gateway Fabric), vedi manifest separato langflow-httproute.yaml +ingress: + enabled: false + +# Il Service del frontend resta ClusterIP (default del chart), sarà +# l'HTTPRoute a instradare il traffico dal Gateway verso questo Service + +# Persistenza dei flow salvati (altrimenti persi al riavvio del pod) +persistence: + enabled: true + size: 5Gi + storageClassName: standard # adatta alla tua StorageClass diff --git a/add-on/AgentPlatform/agent-declarative-vs-byo.yaml b/add-on/AgentPlatform/agent-declarative-vs-byo.yaml new file mode 100644 index 0000000..8a43ca1 --- /dev/null +++ b/add-on/AgentPlatform/agent-declarative-vs-byo.yaml @@ -0,0 +1,166 @@ +# ===================================================================== +# ESEMPIO A — Agent dichiarativo nativo (kagent esegue direttamente) +# Caso d'uso: flow Langflow/Flowise semplice — un LLM + un paio di tool, +# nessuna logica custom complessa. Tradotto 1:1 in prompt + tool MCP. +# ===================================================================== +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: k8s-troubleshooter + namespace: team-alpha +spec: + description: Agente di troubleshooting Kubernetes + type: Declarative + declarative: + modelConfig: gpt4o-config + systemMessage: | + Sei un agente di troubleshooting per Kubernetes... + a2aConfig: + skills: + - id: diagnose-pod-issue + name: Diagnose Pod Issue + description: Investiga problemi su pod/servizi Kubernetes + inputModes: ["text"] + outputModes: ["text"] + tags: ["kubernetes"] + tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + kind: RemoteMCPServer + toolNames: + - k8s_get_pods + - k8s_describe_pod + - k8s_get_logs +--- +apiVersion: kagent.dev/v1alpha1 +kind: ModelConfig +metadata: + name: gpt4o-config + namespace: team-alpha +spec: + provider: OpenAI + model: gpt-4o + apiKeySecretRef: + name: llm-credentials + key: openai-api-key + + + + +# invocazione +Le 4 modalità di invocazione +1. Dashboard kagent (per gli utenti umani, uso interattivo) +bash +kagent dashboard + +Apre una UI web dove cerchi k8s-troubleshooter nella lista e chatti direttamente — il modo più immediato per un developer che vuole testare l'agente senza altri strumenti. + +2. CLI kagent (per script, pipeline, debug da terminale) +bash +kagent invoke --agent k8s-troubleshooter -n team-alpha \ + --task "Il pod payment-service-7d9f in default sta crashando, investiga" +3. Chiamata diretta via A2A REST (per integrazione da altri sistemi/servizi) + +Ogni Agent espone un endpoint A2A standard, con un "agent card" che ne descrive le capability: + +bash +kubectl port-forward -n kagent svc/kagent-service 8083:8083 + +# scopri le capability dell'agente +curl localhost:8083/api/a2a/team-alpha/k8s-troubleshooter/.well-known/agent.json + +# invocalo +curl -X POST localhost:8083/api/a2a/team-alpha/k8s-troubleshooter/ \ + -H "Content-Type: application/json" \ + -d '{"task": "Perché il pod payment-service sta in CrashLoopBackOff?"}' + +Questa è la via che useresti se, ad esempio, un tuo servizio interno (o un'automazione CI/CD) deve invocare l'agente programmaticamente. + +4. Canali chat (Slack/Teams/Discord/Telegram) — via AgentHarness CRD + +Se vuoi che i developer interroghino l'agente direttamente da Slack invece che aprire la dashboard, kagent ha una CRD dedicata (AgentHarness) che fa da ponte: + +yaml +apiVersion: kagent.dev/v1alpha2 +kind: AgentHarness +metadata: + name: k8s-troubleshooter-slack + namespace: kagent +spec: + backend: hermes + modelConfigRef: default-model-config + channels: + - name: platform + type: slack + slack: + botToken: + valueFrom: {type: Secret, name: slack-tokens, key: bot-token} + appToken: + valueFrom: {type: Secret, name: slack-tokens, key: app-token} + +Poi in Slack: /mykagent perché il pod X sta crashando? — il bot inoltra la richiesta all'agente via A2A e posta la risposta nel canale. Interessante per un'IDP perché è il canale più naturale per i developer, senza dover imparare dashboard o CLI dedicate. + +# ===================================================================== +# ESEMPIO B — Agent BYO (Bring Your Own), container esportato da +# Langflow/Flowise dopo containerizzazione custom. +# Caso d'uso: flow complesso con logica di stato/loop che il developer +# ha personalizzato oltre quello che il builder low-code esporta, +# quindi ha bisogno di pieno controllo del codice. +# ===================================================================== +apiVersion: kagent.dev/v1alpha1 +kind: Agent +metadata: + name: currency-exchange-agent + namespace: team-alpha +spec: + type: BYO + byo: + deployment: + image: ghcr.io/team-alpha/langflow-currency-agent:latest + workingDir: /app + env: + - name: GOOGLE_API_KEY + valueFrom: + secretKeyRef: + name: llm-credentials + key: gemini-api-key + port: 8080 # porta su cui l'agente espone l'endpoint A2A + + # Nota: kagent invoca questo agente via protocollo A2A, trattandolo + # come black box — nessuna decomposizione in prompt/tool separati, + # perché la logica vive interamente dentro l'immagine. + + +## Esempio Agent di Orchestrazione +apiVersion: kagent.dev/v1alpha2 +kind: Agent +metadata: + name: incident-commander + namespace: team-alpha +spec: + type: Declarative + declarative: + systemMessage: | + Sei il coordinatore per la gestione incidenti. Quando ricevi una + segnalazione, decidi quali specialisti coinvolgere: se riguarda + pod/servizi K8s, delega al k8s-troubleshooter; se servono i log, + delega al log-analyzer. Puoi chiamare entrambi in sequenza se + il problema lo richiede. + modelConfig: gpt4o-config + tools: + - type: McpServer + mcpServer: + name: kagent-tool-server + toolNames: ["k8s_get_events"] + + # Sotto-agenti esposti come "tool" — la scelta di chiamarli + # è dell'LLM di incident-commander, non di kagent + - type: Agent + agent: + name: k8s-troubleshooter + namespace: team-alpha + - type: Agent + agent: + name: log-analyzer + namespace: team-alpha \ No newline at end of file diff --git a/add-on/monitoring/blackbox-exporter.md b/add-on/monitoring/blackbox-exporter.md index 42eab03..f271882 100644 --- a/add-on/monitoring/blackbox-exporter.md +++ b/add-on/monitoring/blackbox-exporter.md @@ -619,6 +619,11 @@ spec: EOF ``` + + + + + COMANDO - applica alert ```bash kubectl apply -f blackbox-http-alerts.yaml @@ -631,8 +636,119 @@ kubectl describe prometheusrule blackbox-http-alerts -n monitoring ``` -10. TEST MANUALE BLACKBOX EXPORTER -================================= +10. CONFIGURA ALERTMANAGER - INVIO EMAIL SU FAIL DI UN SERVIZIO +================================================================ + +Obiettivo: +- inviare una email a un indirizzo specifico quando la probe di un + servizio specifico (serviceX) fallisce (alert BlackboxHttpProbeFailed). + +FILE - blackbox-email-alert.yaml + +Descrizione: +- crea un receiver email dedicato al servizio da monitorare; +- instrada verso quel receiver solo gli alert che riguardano il + target specifico, identificato tramite il label instance. + +NOTA - credenziali SMTP +Se il server SMTP richiede autenticazione, crea prima un Secret con +la password: + +COMANDO - crea secret con password SMTP +```bash +kubectl create secret generic alertmanager-smtp \ + -n monitoring --from-literal=password='' +``` + +COMANDO - crea blackbox-email-alert.yaml +```bash +cat > blackbox-email-alert.yaml <<'EOF' +apiVersion: monitoring.coreos.com/v1alpha1 +kind: AlertmanagerConfig +metadata: + name: blackbox-email-routing + namespace: monitoring + labels: + release: kube-prometheus-stack +spec: + route: + groupBy: ["alertname", "instance"] + groupWait: 30s + groupInterval: 5m + repeatInterval: 1h + receiver: "email-default" + routes: + - matchers: + - name: alertname + value: BlackboxHttpProbeFailed + matchType: "=" + - name: instance + value: "" + matchType: "=" + receiver: "email-servizioX" + + receivers: + - name: "email-default" + emailConfigs: [] + + - name: "email-servizioX" + emailConfigs: + - to: "" + from: "" + smarthost: ":" + authUsername: "" + authPassword: + name: alertmanager-smtp + key: password + requireTLS: true + sendResolved: true + headers: + subject: "[ALERT] Servizio X non raggiungibile" + html: | +

Il servizio {{ "{{" }} .CommonLabels.instance {{ "}}" }} non risponde.

+

{{ "{{" }} .CommonAnnotations.description {{ "}}" }}

+EOF +``` + +Da personalizzare: +- : valore del label instance della probe da + monitorare (es. http://my-service.my-namespace.svc.cluster.local:8080/health); +- : indirizzo email destinatario; +- , : server SMTP (es. smtp.gmail.com:587); +- : mittente email; +- : utente SMTP, se richiesta autenticazione. + +COMANDO - applica la configurazione +```bash +kubectl apply -f blackbox-email-alert.yaml +``` + +COMANDO - verifica AlertmanagerConfig +```bash +kubectl get alertmanagerconfig -n monitoring +kubectl describe alertmanagerconfig blackbox-email-routing -n monitoring +``` + +NOTA - matcher su instance vs job +Se vuoi far scattare l'email per TUTTI i target di una Probe (job) +invece che per un singolo servizio, sostituisci il matcher su +`instance` con: +```yaml +- name: job + value: "http-services-probe" + matchType: "=" +``` + +COMANDO - verifica alert in Alertmanager +```bash +kubectl port-forward -n monitoring svc/kube-prometheus-stack-alertmanager 9093 +# -> http://localhost:9093, controlla che l'alert BlackboxHttpProbeFailed +# per il servizio X sia instradato sul receiver email-servizioX +``` + + +11. TEST MANUALE BLACKBOX EXPORTER +================================== COMANDO - port-forward blackbox-exporter ```bash @@ -651,7 +767,7 @@ probe_http_status_code 200 ``` -11. TROUBLESHOOTING +12. TROUBLESHOOTING =================== CASO - Prometheus non vede la Probe @@ -700,7 +816,7 @@ Azioni consigliate: - aggiungere un modulo dedicato in blackbox-values.yaml se serve una configurazione HTTP specifica. -12. ORDINE DI ESECUZIONE CONSIGLIATO +13. ORDINE DI ESECUZIONE CONSIGLIATO ==================================== COMANDO - sequenza completa @@ -727,7 +843,7 @@ blackbox-http-alerts.yaml ``` -13. NOTE PER DEV, QA E PROD +14. NOTE PER DEV, QA E PROD =========================== Per separare gli ambienti e semplificare dashboard e alert, usa Probe distinte: diff --git a/pipeline/add-hostalias.sh b/pipeline/add-hostalias.sh new file mode 100644 index 0000000..c52bcac --- /dev/null +++ b/pipeline/add-hostalias.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Aggiunge un hostname a spec.template.spec.hostAliases del Deployment blackbox. +# +# Uso: +# ./add-hostalias.sh +# +# Esempio: +# ./add-hostalias.sh idcidcp.pigreco66.it cert-manager cert-manager +# + +DEPLOYMENT_NAME="${2:-}" +DEPLOYMENT_NS="${3:-}" +TARGET_IP="10.43.37.118" +HOSTNAME_VAL="${1:-}" + +if [[ -z "$HOSTNAME_VAL" ]]; then + echo "Uso: $0 " >&2 + exit 1 +fi + +if ! command -v kubectl >/dev/null 2>&1; then + echo "Errore: kubectl non trovato nel PATH" >&2 + exit 1 +fi + +if ! command -v jq >/dev/null 2>&1; then + echo "Errore: jq non trovato nel PATH" >&2 + echo "Installa jq e riprova." >&2 + exit 1 +fi + +# Idempotenza: controlla solo il blocco hostAliases associato a TARGET_IP. +EXISTING_HOSTNAMES="$(kubectl get deployment "$DEPLOYMENT_NAME" -n "$DEPLOYMENT_NS" -o jsonpath="{.spec.template.spec.hostAliases[?(@.ip=='${TARGET_IP}')].hostnames[*]}" 2>/dev/null || true)" +if echo " $EXISTING_HOSTNAMES " | grep -Fq " $HOSTNAME_VAL "; then + echo "Hostname '$HOSTNAME_VAL' gia presente per IP ${TARGET_IP} in ${DEPLOYMENT_NS}/${DEPLOYMENT_NAME}. Nessuna modifica." + exit 0 +fi + +DEPLOY_JSON="$(kubectl get deployment "$DEPLOYMENT_NAME" -n "$DEPLOYMENT_NS" -o json)" + +UPDATED_HOST_ALIASES="$({ + echo "$DEPLOY_JSON" | jq -c --arg ip "$TARGET_IP" --arg hostname "$HOSTNAME_VAL" ' + (.spec.template.spec.hostAliases //= []) + | if any(.spec.template.spec.hostAliases[]?; .ip == $ip) then + .spec.template.spec.hostAliases |= map( + if .ip == $ip then + if ((.hostnames // []) | index($hostname)) then + . + else + .hostnames = ((.hostnames // []) + [$hostname]) + end + else + . + end + ) + else + .spec.template.spec.hostAliases += [{"ip": $ip, "hostnames": [$hostname]}] + end + | .spec.template.spec.hostAliases + ' +} )" + +PATCH_PAYLOAD="$(jq -cn --argjson hostAliases "$UPDATED_HOST_ALIASES" '{spec:{template:{spec:{hostAliases:$hostAliases}}}}')" + +kubectl patch deployment "$DEPLOYMENT_NAME" \ + -n "$DEPLOYMENT_NS" \ + --type=merge \ + -p "$PATCH_PAYLOAD" >/dev/null + +echo "Hostname aggiunto con successo." +echo " Deployment: ${DEPLOYMENT_NS}/${DEPLOYMENT_NAME}" +echo " IP : ${TARGET_IP}" +echo " Hostname : ${HOSTNAME_VAL}" diff --git a/pipeline/addlistener.sh b/pipeline/addlistener.sh index 389ca07..69fef11 100644 --- a/pipeline/addlistener.sh +++ b/pipeline/addlistener.sh @@ -45,11 +45,13 @@ fi # Se l'hostname non e nel dominio *.italiadatacenter.com, aggiungilo anche a cert-manager hostAliases. if [[ "$host_no_port" != *.italiadatacenter.com ]]; then - HOSTALIAS_SCRIPT="/root/work/pipeline/add-cert-manager-hostalias.sh" + HOSTALIAS_SCRIPT="/root/work/pipeline/add-hostalias.sh" if [[ -x "$HOSTALIAS_SCRIPT" ]]; then - "$HOSTALIAS_SCRIPT" "$host_no_port" + "$HOSTALIAS_SCRIPT" "$host_no_port" "cert-manager" "cert-manager" + "$HOSTALIAS_SCRIPT" "$host_no_port" "blackbox-exporter" "monitoring" elif [[ -f "$HOSTALIAS_SCRIPT" ]]; then - bash "$HOSTALIAS_SCRIPT" "$host_no_port" + bash "$HOSTALIAS_SCRIPT" "$host_no_port" "cert-manager" "cert-manager" + bash "$HOSTALIAS_SCRIPT" "$host_no_port" "blackbox-exporter" "monitoring" else echo "Errore: script non trovato: $HOSTALIAS_SCRIPT" >&2 exit 1 diff --git a/pipeline/deploy.sh b/pipeline/deploy.sh index 1ea3c62..869d222 100644 --- a/pipeline/deploy.sh +++ b/pipeline/deploy.sh @@ -7,44 +7,7 @@ ENVIRONMENT="${1:-dev}" YAML_DIR="kubernetes" -# --------------------------------------------------------------------------- -# Cerca risorse postgresql.cnpg.io/v1 nei manifest e deploya una ConfigMap -# --------------------------------------------------------------------------- -CNPG_FILE=$(grep -rl "postgresql.cnpg.io/v1" "$YAML_DIR" 2>/dev/null | head -1 || true) -if [ -n "$CNPG_FILE" ]; then - echo "Trovata risorsa postgresql.cnpg.io/v1 in: $CNPG_FILE" - - # Estrae metadata.name dal manifest CNPG preferendo yq, altrimenti awk - if command -v yq >/dev/null 2>&1; then - PG_NAME=$(yq eval 'select(.apiVersion == "postgresql.cnpg.io/v1") | .metadata.name' "$CNPG_FILE") - else - PG_NAME=$(awk '/postgresql\.cnpg\.io\/v1/{found=1} found && /^metadata:/{meta=1} meta && /^\s+name:/{print $2; exit}' "$CNPG_FILE") - fi - - # Ricava il namespace dal Role namespace-deployer presente nel cluster - PG_NS=$(kubectl --kubeconfig=./kubeconfig get role namespace-deployer \ - --no-headers \ - -o custom-columns='NS:.metadata.namespace' 2>/dev/null | head -1 || true) - #PG_NS="${PG_NS:-default}" - - if [ -z "$PG_NAME" ]; then - echo "⚠️ Impossibile estrarre metadata.name dal cluster CNPG, skip ConfigMap." >&2 - else - echo " → cluster: $PG_NAME namespace: $PG_NS" - kubectl --kubeconfig=./kubeconfig apply -f - < Date: Sun, 20 Sep 2026 19:34:03 +0200 Subject: [PATCH 2/3] Update IDP-AgentPlatform.docx --- add-on/AgentPlatform/IDP-AgentPlatform.docx | Bin 19239 -> 24637 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/add-on/AgentPlatform/IDP-AgentPlatform.docx b/add-on/AgentPlatform/IDP-AgentPlatform.docx index d82f72aa98f287f4baf058ccd9ea9aebf4e7f414..af2d71780767dae62f085f190e434765174a7747 100644 GIT binary patch delta 23356 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 delta 18026 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 UbF9bY{#en;>InjD6FosP0K+k97XSbN From d41d7f40ccb6b84bc013ee1350e59dc3226e62cb Mon Sep 17 00:00:00 2001 From: alessandro barucci Date: Sun, 20 Sep 2026 19:39:12 +0200 Subject: [PATCH 3/3] Create IDP-AgentPlatform-formattato.docx --- .../Langflow/IDP-AgentPlatform-formattato.docx | Bin 0 -> 22377 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 add-on/AgentPlatform/Langflow/IDP-AgentPlatform-formattato.docx diff --git a/add-on/AgentPlatform/Langflow/IDP-AgentPlatform-formattato.docx b/add-on/AgentPlatform/Langflow/IDP-AgentPlatform-formattato.docx new file mode 100644 index 0000000000000000000000000000000000000000..652b8e832f85722d59c43f455c6e992b8d6a4254 GIT binary patch literal 22377 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