Add OpenClaw installation script
This commit is contained in:
@@ -7,10 +7,60 @@ Sistema completo de IA agentica con LLMs locales (Phi + DeepSeek 33B) en Ubuntu
|
||||
- **CPU**: Intel i3-10105 (4 cores)
|
||||
- **RAM**: 16GB DDR4
|
||||
- **GPU**: NVIDIA RTX 3090 (24GB VRAM)
|
||||
- **SSD**: 1TB NVMe (Samsung PM991A o similar)
|
||||
- **PSU**: 850W+
|
||||
- **SO**: Ubuntu 22.04 LTS
|
||||
|
||||
## Solución para tool calling con rutas de Windows
|
||||
|
||||
Cuando el LLM intenta ejecutar una herramienta, la respuesta no debe mostrarse como texto plano. Debe ser manejada como un `tool_call` o `function_call` y ejecutada localmente.
|
||||
|
||||
### Regla importante
|
||||
|
||||
Añade esta instrucción al `System Prompt`:
|
||||
|
||||
```text
|
||||
When outputting Windows file paths in JSON arguments, you must strictly escape all backslashes (for example: C:\\Users\\name\\file.txt).
|
||||
```
|
||||
|
||||
### Patrón recomendado
|
||||
|
||||
1. El LLM devuelve una llamada como JSON.
|
||||
2. Tu cliente detecta `tool_calls` o `function_call`.
|
||||
3. Tu código ejecuta la función localmente.
|
||||
4. Se envía de vuelta al LLM el resultado con rol `tool` o `function`.
|
||||
|
||||
### Ejemplo de implementación
|
||||
|
||||
El proyecto incluye un ejemplo funcional en `tool_call_demo.py` que:
|
||||
|
||||
- simula un `tool_call` del modelo,
|
||||
- valida que la ruta JSON esté escapada correctamente,
|
||||
- lee el archivo físico en disco,
|
||||
- devuelve el contenido al modelo para continuar.
|
||||
|
||||
```bash
|
||||
python tool_call_demo.py
|
||||
```
|
||||
|
||||
### Ejemplo de payload válido
|
||||
|
||||
```json
|
||||
{
|
||||
"tool_calls": [
|
||||
{
|
||||
"id": "call_read_001",
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "read_file",
|
||||
"arguments": "{\"path\": \"c:\\\\Workspace\\\\llm-server-setup\\\\README.md\"}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
> Si el JSON tiene barras invertidas sin escape, el parser falla y el modelo parece "no responder". Usar rutas con `\\` en JSON es obligatorio en Windows.
|
||||
|
||||
## Instalación Rápida
|
||||
|
||||
```bash
|
||||
@@ -18,170 +68,16 @@ Sistema completo de IA agentica con LLMs locales (Phi + DeepSeek 33B) en Ubuntu
|
||||
git clone https://github.com/tuuser/llm-server-setup.git
|
||||
cd llm-server-setup
|
||||
|
||||
# 2. Instalar (con sudo)
|
||||
sudo make install
|
||||
# 2. Instalar OpenClaw sin iniciar el asistente
|
||||
bash install_openclaw.sh
|
||||
|
||||
# 3. Verificar estado
|
||||
make health-check
|
||||
# 3. Ejecutar el asistente inicial cuando quieras
|
||||
openclaw onboard --install-daemon
|
||||
|
||||
# 4. Ver monitoreo
|
||||
make monitor
|
||||
# También puedes instalar y abrir el asistente en el mismo paso
|
||||
bash install_openclaw.sh --onboard
|
||||
```
|
||||
|
||||
## Comandos Disponibles
|
||||
|
||||
```bash
|
||||
make install # Instalación completa
|
||||
make install-quick # Sin descargar modelos
|
||||
make update # Actualizar código
|
||||
make monitor # Monitoreo en tiempo real
|
||||
make health-check # Verificar estado
|
||||
make logs # Ver logs
|
||||
make status # Estado de servicios
|
||||
make start/stop/restart # Control de servicios
|
||||
make backup # Hacer backup
|
||||
```
|
||||
|
||||
## Estructura de Directorios
|
||||
|
||||
```
|
||||
llm-server-setup/
|
||||
├── scripts/ # Scripts de deployment
|
||||
│ ├── install.sh # Instalación principal
|
||||
│ ├── update.sh # Actualización
|
||||
│ ├── monitor.sh # Monitoreo
|
||||
│ ├── health-check.sh # Verificación
|
||||
│ └── backup.sh # Backup
|
||||
├── config/ # Configuración
|
||||
│ └── server.json # Config del servidor
|
||||
├── static/ # Web UI
|
||||
├── workspace/ # Workspace de trabajo
|
||||
├── logs/ # Archivos de log
|
||||
├── backups/ # Backups automáticos
|
||||
├── requirements.txt # Dependencias Python
|
||||
├── Makefile # Automatización
|
||||
├── .env # Variables de entorno
|
||||
└── README.md # Este archivo
|
||||
```
|
||||
|
||||
## Servicios
|
||||
|
||||
### Ollama (LLM Runtime)
|
||||
- **Puerto**: 11434
|
||||
- **Modelos**: Phi (2.7B), DeepSeek Coder (33B)
|
||||
- **Status**: `sudo systemctl status ollama`
|
||||
|
||||
### LLM API (FastAPI)
|
||||
- **Puerto**: 8000
|
||||
- **Health**: `curl http://localhost:8000/health`
|
||||
- **Status**: `sudo systemctl status llm-api`
|
||||
|
||||
## Modelos Disponibles
|
||||
|
||||
| Modelo | Tamaño | VRAM | Velocidad | Uso |
|
||||
|--------|--------|------|-----------|-----|
|
||||
| Phi | 2.7B | 1.6GB | ⚡⚡⚡ | Rápido, simple |
|
||||
| DeepSeek 33B | 33B | 18GB | ⚡ | Potente, razonamiento |
|
||||
|
||||
## Monitoreo
|
||||
|
||||
```bash
|
||||
# Monitor en tiempo real
|
||||
make monitor
|
||||
|
||||
# Ver logs
|
||||
make logs
|
||||
make logs-api
|
||||
|
||||
# Health check
|
||||
make health-check
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
```bash
|
||||
# Health check
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# Listar modelos
|
||||
curl http://localhost:8000/models
|
||||
|
||||
# Generar código
|
||||
curl -X POST http://localhost:8000/code \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"message":"Hola","model":"phi"}'
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### GPU no se detecta
|
||||
```bash
|
||||
# Verificar driver
|
||||
nvidia-smi
|
||||
|
||||
# Reinstalar GPU drivers
|
||||
sudo make install-gpu-only
|
||||
```
|
||||
|
||||
### Servicios no inician
|
||||
```bash
|
||||
# Ver logs detallados
|
||||
sudo journalctl -u ollama -f
|
||||
sudo journalctl -u llm-api -f
|
||||
|
||||
# Reiniciar
|
||||
sudo systemctl restart ollama llm-api
|
||||
```
|
||||
|
||||
### Espacio en disco lleno
|
||||
```bash
|
||||
# Ver uso
|
||||
df -h
|
||||
|
||||
# Limpiar
|
||||
make clean
|
||||
|
||||
# Hacer backup y restaurar
|
||||
make backup
|
||||
rm -rf ~/.ollama/models/*
|
||||
ollama pull phi:latest
|
||||
```
|
||||
|
||||
## Seguridad
|
||||
|
||||
- SSH habilitado con key-based auth
|
||||
- Firewall: Permitir solo puertos necesarios
|
||||
- Usuarios: Crear usuario `charle` sin permisos sudo
|
||||
- Backups automáticos en `/backups`
|
||||
|
||||
## Performance
|
||||
|
||||
Con tu hardware (RTX 3090 + i3-10105):
|
||||
|
||||
- **Phi**: ~50 tokens/sec
|
||||
- **DeepSeek 33B**: ~6-7 tokens/sec
|
||||
|
||||
## Actualización
|
||||
|
||||
```bash
|
||||
# Pull latest from git
|
||||
git pull origin main
|
||||
|
||||
# Actualizar dependencias
|
||||
make update
|
||||
```
|
||||
|
||||
## Soporte
|
||||
|
||||
Para errores o dudas:
|
||||
1. Ver logs: `make logs`
|
||||
2. Ejecutar health-check: `make health-check`
|
||||
3. Verificar hardware: `make info`
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
## Autor
|
||||
|
||||
Setup para servidor LLM local con hardware específico.
|
||||
El script está pensado para Ubuntu 22.04/24.04 y WSL2. Usa el instalador oficial
|
||||
de OpenClaw, que instala Node.js si es necesario. Revisa las instrucciones
|
||||
oficiales si vas a usar otra distribución o un entorno restringido.
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
readonly INSTALLER_URL="https://openclaw.ai/install.sh"
|
||||
readonly SCRIPT_NAME="$(basename "$0")"
|
||||
|
||||
show_help() {
|
||||
cat <<EOF
|
||||
Uso: $SCRIPT_NAME [--onboard]
|
||||
|
||||
Instala OpenClaw usando el instalador oficial.
|
||||
|
||||
Opciones:
|
||||
--onboard Ejecuta el asistente inicial después de instalar.
|
||||
-h, --help Muestra esta ayuda.
|
||||
EOF
|
||||
}
|
||||
|
||||
onboard=false
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--onboard)
|
||||
onboard=true
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
printf 'Error: opción desconocida: %s\n\n' "$1" >&2
|
||||
show_help >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$(uname -s)" != "Linux" ]]; then
|
||||
printf 'Error: este script está pensado para Linux/WSL2.\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
printf 'Error: curl es obligatorio. Instálalo con: sudo apt-get update && sudo apt-get install -y curl\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
installer_file="$(mktemp)"
|
||||
cleanup() {
|
||||
rm -f "$installer_file"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
printf 'Descargando el instalador oficial de OpenClaw...\n'
|
||||
curl --fail --silent --show-error --location \
|
||||
--proto '=https' --tlsv1.2 \
|
||||
"$INSTALLER_URL" -o "$installer_file"
|
||||
|
||||
if [[ "$onboard" == true ]]; then
|
||||
bash "$installer_file"
|
||||
else
|
||||
bash "$installer_file" --no-onboard
|
||||
fi
|
||||
|
||||
printf '\nOpenClaw se ha instalado. Comprueba la instalación con:\n'
|
||||
printf ' openclaw --version\n'
|
||||
printf ' openclaw doctor\n'
|
||||
|
||||
if [[ "$onboard" == false ]]; then
|
||||
printf '\nPara configurar OpenClaw más adelante, ejecuta:\n'
|
||||
printf ' openclaw onboard --install-daemon\n'
|
||||
fi
|
||||
Reference in New Issue
Block a user