feat: scripts detect-provider.sh, personalize.sh e integración en create-full.sh
Scripts atómicos para automatizar el Paso 8 (personalización) del pipeline
de creación de agentes:
- dev-scripts/agent/detect-provider.sh: detecta el primer LLM provider
disponible desde .env (OPENAI_API_KEY → openai, ANTHROPIC_API_KEY →
anthropic, fallback openai con warn).
- dev-scripts/agent/personalize.sh <agent-id> [flags]: genera/actualiza
los 3 archivos del agente en un solo paso:
· config.yaml: description, tone, prefix, provider, model, tool_use
· agent.go: package name correcto (sin guiones, sin _bot), Register ID
· prompts/system.md: prompt inline/file + sección de seguridad anti-injection
Flags: --description, --provider, --model, --tone, --prefix,
--system-prompt, --system-prompt-file, --tool-use, --language.
Usa PyYAML (python3) para editar el YAML preservando comentarios.
- dev-scripts/agent/create-full.sh: extendido con los mismos flags
opcionales. Si se pasan, ejecuta personalize.sh como Paso 8 automático
y recompila. Sin flags → comportamiento actual (retrocompatible).
Impacto: Father Bot puede completar el pipeline completo (pasos 1-8) con
un solo Bash tool call, eliminando las ~6-10 ediciones manuales de archivos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# create-full.sh — pipeline completo para crear un agente o robot funcional
|
||||
#
|
||||
# Pipeline de 7 pasos:
|
||||
# Pipeline de 7+1 pasos:
|
||||
# 1. SCAFFOLD → crear archivos base desde template
|
||||
# 2. BUILD → go build -tags goolm ./...
|
||||
# 3. REGISTER → crear usuario Matrix + token
|
||||
@@ -9,17 +9,34 @@
|
||||
# 5. CONVERT (robot) → eliminar LLM/prompts si type=robot
|
||||
# 6. AUTO-AVATAR → generar y aplicar foto de perfil
|
||||
# 7. DISPLAY NAME → configurar nombre visible en Matrix
|
||||
# 8. PERSONALIZE → (automatico si se pasan --description / --system-prompt)
|
||||
#
|
||||
# Pasos posteriores (manuales o via father-bot):
|
||||
# 8. PERSONALIZE → config.yaml, agent.go, system prompt
|
||||
# Pasos posteriores:
|
||||
# 9. REBUILD → recompilar tras personalizacion
|
||||
# 10. START/RESTART → arrancar el launcher con el bot
|
||||
# 11. HEALTH CHECK → ./dev-scripts/agent/health-check.sh <id>
|
||||
# 12. SELF-INTRODUCE → ./dev-scripts/agent/notify-developer.sh <id>
|
||||
#
|
||||
# Uso:
|
||||
# ./dev-scripts/agent/create-full.sh <agent-id> "Display Name" # agente (default)
|
||||
# ./dev-scripts/agent/create-full.sh <agent-id> "Display Name" --type robot # robot
|
||||
# Uso básico:
|
||||
# ./dev-scripts/agent/create-full.sh <agent-id> "Display Name"
|
||||
# ./dev-scripts/agent/create-full.sh <agent-id> "Display Name" --type robot
|
||||
#
|
||||
# Uso con personalización automática (Paso 8 incluido):
|
||||
# ./dev-scripts/agent/create-full.sh weather-bot "Weather Bot" \
|
||||
# --description "Consulta el tiempo actual y predicciones" \
|
||||
# --provider anthropic \
|
||||
# --system-prompt "Eres Weather Bot, especialista en meteorología."
|
||||
#
|
||||
# Flags de personalización (opcionales, activan el Paso 8 automático):
|
||||
# --description "<texto>" descripcion del agente
|
||||
# --provider <openai|anthropic|...> proveedor LLM (default: auto-detect)
|
||||
# --model <modelo> modelo LLM (default: segun provider)
|
||||
# --tone <friendly|professional|...> tono (default: friendly)
|
||||
# --prefix "<emoji>" emoji prefix (default: 🤖)
|
||||
# --system-prompt "<texto>" system prompt inline
|
||||
# --system-prompt-file <path> system prompt desde archivo
|
||||
# --tool-use habilitar tool_use en config
|
||||
# --language <es|en> idioma (default: es)
|
||||
#
|
||||
# Requisitos en .env:
|
||||
# MATRIX_ADMIN_TOKEN, MATRIX_HOMESERVER, MATRIX_SERVER_NAME
|
||||
@@ -36,21 +53,42 @@ TYPE="agent"
|
||||
NORM="$(normalize_id "$ID")"
|
||||
SCRIPT_DIR="$(dirname "$0")"
|
||||
|
||||
# Parse --type flag
|
||||
# Flags de personalización (Paso 8)
|
||||
PERSONALIZE_DESCRIPTION=""
|
||||
PERSONALIZE_PROVIDER=""
|
||||
PERSONALIZE_MODEL=""
|
||||
PERSONALIZE_TONE="friendly"
|
||||
PERSONALIZE_PREFIX="🤖"
|
||||
PERSONALIZE_SYSTEM_PROMPT=""
|
||||
PERSONALIZE_SYSTEM_PROMPT_FILE=""
|
||||
PERSONALIZE_TOOL_USE=false
|
||||
PERSONALIZE_LANGUAGE="es"
|
||||
DO_PERSONALIZE=false
|
||||
|
||||
# Parse flags
|
||||
shift 2 2>/dev/null || shift 1 2>/dev/null || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--type)
|
||||
TYPE="${2:-agent}"
|
||||
shift 2
|
||||
;;
|
||||
--type=*)
|
||||
TYPE="${1#--type=}"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
shift
|
||||
;;
|
||||
--type) TYPE="${2:-agent}"; shift 2 ;;
|
||||
--type=*) TYPE="${1#--type=}"; shift ;;
|
||||
--description) PERSONALIZE_DESCRIPTION="${2:-}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--description=*) PERSONALIZE_DESCRIPTION="${1#--description=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--provider) PERSONALIZE_PROVIDER="${2:-}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--provider=*) PERSONALIZE_PROVIDER="${1#--provider=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--model) PERSONALIZE_MODEL="${2:-}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--model=*) PERSONALIZE_MODEL="${1#--model=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--tone) PERSONALIZE_TONE="${2:-friendly}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--tone=*) PERSONALIZE_TONE="${1#--tone=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--prefix) PERSONALIZE_PREFIX="${2:-🤖}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--prefix=*) PERSONALIZE_PREFIX="${1#--prefix=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--system-prompt) PERSONALIZE_SYSTEM_PROMPT="${2:-}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--system-prompt=*) PERSONALIZE_SYSTEM_PROMPT="${1#--system-prompt=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--system-prompt-file) PERSONALIZE_SYSTEM_PROMPT_FILE="${2:-}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--system-prompt-file=*) PERSONALIZE_SYSTEM_PROMPT_FILE="${1#--system-prompt-file=}"; DO_PERSONALIZE=true; shift ;;
|
||||
--tool-use) PERSONALIZE_TOOL_USE=true; DO_PERSONALIZE=true; shift ;;
|
||||
--language) PERSONALIZE_LANGUAGE="${2:-es}"; DO_PERSONALIZE=true; shift 2 ;;
|
||||
--language=*) PERSONALIZE_LANGUAGE="${1#--language=}"; DO_PERSONALIZE=true; shift ;;
|
||||
*) shift ;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -175,9 +213,46 @@ fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ── Paso 8 (automático, solo agents): Personalizar archivos ─────────────
|
||||
PERSONALIZE_DONE=false
|
||||
if $DO_PERSONALIZE && [[ "$TYPE" != "robot" ]]; then
|
||||
PERSONALIZE_EXTRA_STEP=$((TOTAL_STEPS + 1))
|
||||
info "Paso ${PERSONALIZE_EXTRA_STEP} — Personalizando archivos del agente (automático)..."
|
||||
echo ""
|
||||
|
||||
# Construir args para personalize.sh
|
||||
PERSONALIZE_ARGS=()
|
||||
[[ -n "$PERSONALIZE_DESCRIPTION" ]] && PERSONALIZE_ARGS+=(--description "$PERSONALIZE_DESCRIPTION")
|
||||
[[ -n "$PERSONALIZE_PROVIDER" ]] && PERSONALIZE_ARGS+=(--provider "$PERSONALIZE_PROVIDER")
|
||||
[[ -n "$PERSONALIZE_MODEL" ]] && PERSONALIZE_ARGS+=(--model "$PERSONALIZE_MODEL")
|
||||
[[ "$PERSONALIZE_TONE" != "friendly" ]] && PERSONALIZE_ARGS+=(--tone "$PERSONALIZE_TONE")
|
||||
[[ "$PERSONALIZE_PREFIX" != "🤖" ]] && PERSONALIZE_ARGS+=(--prefix "$PERSONALIZE_PREFIX")
|
||||
[[ -n "$PERSONALIZE_SYSTEM_PROMPT" ]] && PERSONALIZE_ARGS+=(--system-prompt "$PERSONALIZE_SYSTEM_PROMPT")
|
||||
[[ -n "$PERSONALIZE_SYSTEM_PROMPT_FILE" ]] && PERSONALIZE_ARGS+=(--system-prompt-file "$PERSONALIZE_SYSTEM_PROMPT_FILE")
|
||||
$PERSONALIZE_TOOL_USE && PERSONALIZE_ARGS+=(--tool-use)
|
||||
[[ "$PERSONALIZE_LANGUAGE" != "es" ]] && PERSONALIZE_ARGS+=(--language "$PERSONALIZE_LANGUAGE")
|
||||
|
||||
if "$SCRIPT_DIR/personalize.sh" "$ID" "${PERSONALIZE_ARGS[@]}"; then
|
||||
ok "Personalización completada"
|
||||
PERSONALIZE_DONE=true
|
||||
|
||||
# Recompilar tras personalización
|
||||
info "Recompilando tras personalización..."
|
||||
if "$GO" build -tags goolm ./... 2>&1; then
|
||||
ok "Recompilación exitosa"
|
||||
else
|
||||
fail "Error de compilación tras personalización — revisa agents/$ID/agent.go"
|
||||
fi
|
||||
else
|
||||
warn "Personalización falló — revisa los flags o edita los archivos manualmente"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ── Paso final: Notificar al developer ───────────────────────────────────
|
||||
NOTIFY_STEP=$TOTAL_STEPS
|
||||
info "Paso ${NOTIFY_STEP}/${TOTAL_STEPS} — Notificando a desarrolladores..."
|
||||
info "Paso ${NOTIFY_STEP}+ — Notificando a desarrolladores..."
|
||||
echo ""
|
||||
|
||||
"$SCRIPT_DIR/notify-developer.sh" "$ID" "$TYPE" "$DISPLAYNAME" || true
|
||||
@@ -205,8 +280,26 @@ echo ""
|
||||
echo -e " ${BLU}Launcher actualizado:${RST}"
|
||||
echo -e " cmd/launcher/main.go (import)"
|
||||
echo ""
|
||||
echo -e "${YLW}Siguientes pasos (8-12 del pipeline):${RST}"
|
||||
echo ""
|
||||
if $PERSONALIZE_DONE; then
|
||||
echo -e "${GRN}Paso 8 completado automáticamente ✓${RST}"
|
||||
echo -e " ${DIM}config.yaml, agent.go y prompts/system.md personalizados${RST}"
|
||||
echo ""
|
||||
echo -e "${YLW}Siguientes pasos (9-12 del pipeline):${RST}"
|
||||
echo ""
|
||||
echo -e " ${BLU}9. REBUILD${RST}:"
|
||||
echo -e " ${DIM}go build -tags goolm ./...${RST}"
|
||||
echo ""
|
||||
echo -e " ${BLU}10. START${RST}:"
|
||||
echo -e " ${DIM}./dev-scripts/server/start.sh${RST}"
|
||||
echo ""
|
||||
echo -e " ${BLU}11. HEALTH CHECK${RST}:"
|
||||
echo -e " ${DIM}./dev-scripts/agent/health-check.sh $ID${RST}"
|
||||
echo ""
|
||||
echo -e " ${BLU}12. SELF-INTRODUCE${RST} (tras health check ok):"
|
||||
echo -e " ${DIM}./dev-scripts/agent/notify-developer.sh $ID $TYPE \"$DISPLAYNAME\"${RST}"
|
||||
else
|
||||
echo -e "${YLW}Siguientes pasos (8-12 del pipeline):${RST}"
|
||||
echo ""
|
||||
if [[ "$TYPE" == "robot" ]]; then
|
||||
echo -e " ${BLU}8. PERSONALIZE${RST} — añadir comandos custom:"
|
||||
echo -e " ${DIM}agents/$ID/commands.go${RST}"
|
||||
@@ -230,3 +323,4 @@ echo ""
|
||||
echo -e " ${BLU}12. SELF-INTRODUCE${RST} (tras health check ok):"
|
||||
echo -e " ${DIM}./dev-scripts/agent/notify-developer.sh $ID $TYPE \"$DISPLAYNAME\"${RST}"
|
||||
echo ""
|
||||
fi # end $PERSONALIZE_DONE else
|
||||
|
||||
Reference in New Issue
Block a user